带有承诺的 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 确切地知道 属性 它会查找什么,这使得一切正常。
以下 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 确切地知道 属性 它会查找什么,这使得一切正常。