【问题标题】:Element implicitly has an 'any' type because type 'xxx' has no index signature元素隐式具有“任何”类型,因为类型“xxx”没有索引签名
【发布时间】:2019-05-05 05:33:40
【问题描述】:

我在打字稿中尝试重构一个es6项目时遇到了两个关于这个问题的案例,一个是关于Object.keys(),另一个是关于import * as xxx

案例一:

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')

map 中的 k 保证是 SUPPORTED_VALUES 中的键,但 typescript 编译器不知道这一点。我应该如何在不禁用 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中,但是typescript编译器无法处理。

【问题讨论】:

    标签: javascript typescript ecmascript-6


    【解决方案1】:

    在情况 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)
    }
    

    【讨论】:

    • 对于案例 1,这需要扩展 SUPPORTED_VALUES 的类型签名。有没有办法在不强制转换的情况下将其保持为 { min_s: string; max_rc: string; }
    • case 1 中的 k 和 case 2 中的 cmd 不能是任何东西,因为第一个来自 Object.keys(),第二个由 if(cmd in cmdHandlers) 检查。我认为这可能是打字稿编译器的限制?
    猜你喜欢
    • 2019-10-03
    • 2018-04-09
    • 2018-09-06
    • 2019-05-12
    • 2017-06-30
    • 2021-08-24
    • 2019-04-01
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多