Javascript 是否可以在typescript中的可索引类型接口中定义函数?

Javascript 是否可以在typescript中的可索引类型接口中定义函数?,javascript,typescript,Javascript,Typescript,我想定义以下内容: export interface IValidationContextIndex { [validationContextKey: string]: ValidationContext; getValidationContexts(): Array<ValidationContext>; } 问题是typescripts希望索引签名与所有声明的成员一致。因为您也可以使用索引访问getvalidationcontext成员,并且它的类型将不是Val

我想定义以下内容:

export interface IValidationContextIndex {
    [validationContextKey: string]: ValidationContext;
    getValidationContexts(): Array<ValidationContext>;
}

问题是typescripts希望索引签名与所有声明的成员一致。因为您也可以使用索引访问
getvalidationcontext
成员,并且它的类型将不是
ValidationContext

您可以使索引签名与定义的成员保持一致,但这并不理想,因为您需要缩小返回类型:

export interface IValidationContextIndex {
    [validationContextKey: string]: ValidationContext | (() => Array<ValidationContext>);
    getValidationContexts(): Array<ValidationContext>;
}
或使用类型断言:

let o : IValidationContextIndex = {
    getValidationContexts(): Array<ValidationContext> {
        return Object.values(this)as any
    }
} as IValidationContextIndex;
让o:IValidationContextIndex={
getValidationContexts():数组{
返回Object.values(this)作为任意
}
}作为IValidationContextIndex;

为什么TS不喜欢您的定义?似乎对我有用。@TylereBastian取决于你对
ValidationContext
class ValidationContext{private x!:string}
的定义,例如,它对我不起作用-你就像Typescript中的李小龙!谢谢@Ole:))10倍。我只是一个有点痴迷的粉丝:P
type IValidationContextIndex = {
    [validationContextKey: string]: ValidationContext;
} & {
    getValidationContexts(): Array<ValidationContext>;
}
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;