我是打字稿的新手。我有一个大型程序,我从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]
}
但这并没有真正改变任何事情。
答案 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]
}
并且您将获得更准确的返回类型,该类型反映了foo
,bar
等类型。