元素隐式具有“ any”类型,因为类型“ xxx”没有索引签名

时间:2019-05-05 05:33:41

标签: javascript typescript ecmascript-6

当我尝试在打字稿中重构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中的mapSUPPORTED_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,但是打字稿编译器无法处理。

1 个答案:

答案 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仅包括cmd1cmd2。您可以为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)
}