我想定义以下内容:
export interface IValidationContextIndex {
[validationContextKey: string]: ValidationContext;
getValidationContexts(): Array<ValidationContext>;
}
这样我就可以获得一个遵循 IValidationContextIndex
接口(interface)的对象,并对其调用 getValidationContexts
。
但是 VSCode 对这种类型的定义不满意。是否可以在界面中执行此操作,或者我是否需要类似的内容:
class cache {
constructor(public index: IValidationContextIndex ) {};
getValidationContexts() {return Object.value(<any> index)}
}
最佳答案
问题是 typescript 希望索引签名与所有声明的成员保持一致。因为您也可以使用索引访问 getValidationContexts
成员,并且它的类型不会是 ValidationContext
。
您可以使索引签名与定义的成员一致,但这并不理想,因为您需要缩小返回类型:
export interface IValidationContextIndex {
[validationContextKey: string]: ValidationContext | (() => Array<ValidationContext>);
getValidationContexts(): Array<ValidationContext>;
}
绕过此限制的一种方法是使用交集类型:
type IValidationContextIndex = {
[validationContextKey: string]: ValidationContext;
} & {
getValidationContexts(): Array<ValidationContext>;
}
但是由于同样的索引不兼容原因,无法直接创建这种类型的对象。您需要使用 Object.assign
创建对象:
let o : IValidationContextIndex = Object.assign({ a: new ValidationContext() }, {
getValidationContexts(): Array<ValidationContext> {
return Object.values(this)as any
}
});
或者使用类型断言:
let o : IValidationContextIndex = {
getValidationContexts(): Array<ValidationContext> {
return Object.values(this)as any
}
} as IValidationContextIndex;
关于javascript - 是否可以在 typescript 的可索引类型接口(interface)中定义函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51072023/