当我尝试在打字稿中重构es6项目时,遇到两种有关此问题的情况,一种是关于Object.keys()
,另一种是关于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
中的map
是SUPPORTED_VALUES
中的键,但是打字稿编译器对此一无所知。如何在不禁用noImplicitAny
的情况下解决此问题?
情况2:
我有一个名为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
,但是打字稿编译器无法处理。
答案 0 :(得分:0)
在情况1中,您需要像SUPPORTED_VALUES
那样为{[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)
}