javascript - 元素隐式具有“任何”类型,因为类型“xxx”没有索引签名
问题描述
当我尝试在 typescript 中重构一个 es6 项目时,我遇到了两个关于这个问题的案例,一个是 about Object.keys()
,另一个是 about import * as xxx
。
情况1:
const SUPPORTED_VALUES = {
min_s: 'Mininum similarity',
max_rc: 'Maximum result count'
}
const UNSUPPORTED_MSG =
'Configurable values:\n' +
Object.keys(SUPPORTED_VALUES)
.map(k => `${k}: ${SUPPORTED_VALUES[k]}`)
.join('\n')
k
in 保证是 in 的一个map
键SUPPORTED_VALUES
,但 typescript 编译器不知道这一点。我应该如何在不禁用的情况下解决这个问题noImplicitAny
?
案例二:
我有一个名为cmd.ts
:
export async function cmd1(args){}
export async function cmd2(args){}
它使用的是另一个像这样的文件:
import * as cmdHandlers from './cmd'
// some code...
if (cmd in cmdHandlers) {
await cmdHandlers[cmd](bot, msg, ...args)
}
这也保证cmd
存在于 中cmdHandlers
,但打字稿编译器无法处理。
解决方案
在情况 1 中,您需要为SUPPORTED_VALUES
like定义准确的类型{[key: string]: string}
const SUPPORTED_VALUES: {[key: string]: string} = {
min_s: 'Minimum similarity',
max_rc: 'Maximum result count'
}
const UNSUPPORTED_MSG =
'Configurable values:\n' +
Object.keys(SUPPORTED_VALUES)
.map(k => `${k}: ${SUPPORTED_VALUES[k]}`)
.join('\n')
案例 2,同样的案例 1,cmd
可以是任何东西,但cmdHandlers
只包括cmd1
和cmd2
。您可以为cmd.ts
模块定义类型,使其cmdHandlers
成为具有任何属性名称的对象。
我认为没关系,因为在调用函数之前你有一个条件
// cmd.ts
async function cmd1(...args: any) { }
async function cmd2(...args: any) { }
const myExport: { [key: string]: (...args: any) => void } = {
cmd1,
cmd2,
}
export default myExport;
//
import cmdHandlers from './cmd'
// some code...
if (cmd in cmdHandlers) {
await cmdHandlers[cmd](bot, msg, ...args)
}
推荐阅读
- amazon-web-services - 如何限制 IAM 用户访问(列出)特定角色和 CF 堆栈?
- django - django 如何知道是否将新项目添加到 manytomanyfield
- listview - Flutter:ListView.builder 创建列
- reactjs - Material UI 0.2x 与 React 16 的兼容性
- java - 在 Java 中插入 Oracle 嵌套表
- pycharm - 如何防止这种情况:我将焦点切换到不同的应用程序(alt+tab),切换回 Pycharm,然后项目树崩溃?
- paypal - 客户贝宝按钮购买后更改谷歌驱动器链接
- php - 为什么有些电子邮件 ID 被接受而有些不是 PHP
- python - 使用返回看不到结果
- android - 字段重叠,以编程方式创建布局