typescript,import * as,没有带括号属性访问器的索引签名

时间:2018-01-07 07:11:32

标签: typescript

我是打字稿的新手。我有一个大型程序,我从javascript转换。我经历了错误并添加了类型,但我无法弄清楚如何解决这个问题。

myModule.ts

export const foo = { ... }
export const bar = { ... }

myFile.ts

import * as myModule from './myModule'

function doesSomething(input: string) {
    return myModule[input]
}

Typescript编译器错误:Element隐式地有一个' any'输入因为类型' typeof" ./ myModule"'没有索引签名。

我已尝试声明模块和命名空间或尝试实现接口,但似乎无法工作。我认为解决方案是在单独的文件中声明模块,但我似乎无法让TS识别它。这就是我认为可行的方法:

myModule.d.ts

interface MyModule {
    [key: string]: any
}

declare module 'myModule' {
    const myModule: MyModule
    export = myModule
}

可能会添加指向myFile的三重斜杠:

myFile.ts

/// <reference path="./myModule.d.ts" />
import * as myModule from './myModule'

function doesSomething(input: string) {
    return myModule[input]
}

但这并没有真正改变任何事情。

1 个答案:

答案 0 :(得分:2)

如果您只希望使用其值与doesSomething的名称相同的字符串调用myModule,则可以执行类似

的操作
import * as myModule from './myModule';

type ModuleType = typeof myModule;

function doesSomething<K extends keyof ModuleType>(input: K): ModuleType[K] {
    return myModule[input]
}

并且您将获得更准确的返回类型,该类型反映了foobar等类型。