打字稿,导入 * as,没有带括号属性访问器的索引签名

Ric*_*ter 2 typescript

我是打字稿的新手。我有一个从 javascript 转换而来的大型程序。我正在检查错误并添加类型,但我不知道如何解决这个问题。

myModule.ts

export const foo = { ... }
export const bar = { ... }
Run Code Online (Sandbox Code Playgroud)

我的文件

import * as myModule from './myModule'

function doesSomething(input: string) {
    return myModule[input]
}
Run Code Online (Sandbox Code Playgroud)

打字稿编译器错误:元素隐式具有“任何”类型,因为类型“typeof“./myModule””没有索引签名。

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

myModule.d.ts

interface MyModule {
    [key: string]: any
}

declare module 'myModule' {
    const myModule: MyModule
    export = myModule
}
Run Code Online (Sandbox Code Playgroud)

也许添加一个三斜线指向 myFile:

我的文件

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

function doesSomething(input: string) {
    return myModule[input]
}
Run Code Online (Sandbox Code Playgroud)

但这并没有真正改变任何东西。

Dan*_*ser 6

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

import * as myModule from './myModule';

type ModuleType = typeof myModule;

function doesSomething<K extends keyof ModuleType>(input: K): ModuleType[K] {
    return myModule[input]
}
Run Code Online (Sandbox Code Playgroud)

你就会有反映类型更准确的返回类型foobar等等。