带有承诺的 TypeScript 索引签名

TypeScript index signature with promises

以下 class 的正确索引签名是什么?

class MyClass {
  [index: string]: Promise<void> | Promise<MyType>; // not working

  public async methodOne (): Promise<void> { ... }
  public async methodTwo (): Promise<MyType> { ... }
}

我希望能够使用方法的字符串名称在此 class 上执行方法:

myClassInstance[stringNameOfMethodOne]()

有两个TypeScript错误,一个关于方法定义,一个关于方法的使用。方法定义错误为:

Property 'methodOne' of type '() => Promise<void>' is not assignable to 'string' index type 'Promise<void> | Promise<MyType>'

该方法的使用错误为:

This expression is not callable. No constituent of type 'Promise<MyType> | Promise<void>' is callable.

我在 JavaScript 中完成了此操作,但对 TypeScript 的索引签名不太熟悉。

您可能只是忘记了函数类型:

class MyClass {
  [index: string]: () => (Promise<void> | Promise<MyType>); // A function type returning a Promise

  public async methodOne (): Promise<void> { ... }
  public async methodTwo (): Promise<MyType> { ... }
}

您可能根本不需要索引签名。因为这很好用:

interface MyType { myType: true }

class MyClass {
  public async methodOne (): Promise<void> {}
  public async methodTwo (): Promise<MyType> { return { myType: true } }
}

const stringNameOfMethodOne = 'methodOne'
const myClassInstance = new MyClass()
myClassInstance[stringNameOfMethodOne]() // works

stringNameOfMethodOne 这里实际上是一个字符串文字类型,所以 typescript 确切地知道 属性 它会查找什么,这使得一切正常。