具有未知属性键的typescript接口定义

时间:2014-05-28 14:20:36

标签: typescript

如何表达接口(IResponse),其中一个属性具有字符串键(静态不知道)。下面,密钥values可以是bookschairs等所有内容。所有其他密钥和类型都是静态已知的。低于implementation会出错。我猜错误是因为IResponse上的索引签名使所有属性值都为IValue[]。有没有办法做到这一点?

export interface IMeta{}
export interface IValue{}
export interface IResponse {
     meta: IMeta;
     [index: string]:IValue[];
}

 export class Response implements IResponse {
    meta:IMeta;
    values:IValue[];
    //books:IValue[];
    //anything:IValue[];
 }

4 个答案:

答案 0 :(得分:4)

如果为已知类型定义一个接口而为“未知”类型定义一个接口,则可以使用类型断言告诉编译器您要使用的类型。

这不是理想的,但你是在一个边缘情况下工作(即不是完全动态的,而不是完全静态的)。

export interface IMeta{}
export interface IValue{}
export interface IFunkyResponse {
     [index: string]:IValue[];
}
export interface IResponse {
     meta: IMeta;
}

export class Response implements IResponse {
    meta:IMeta;
    values:IValue[];
    books:IValue[];
    anything:IValue[];
}

您可以在<IResponse> resp<IFunkyResponse> resp之间键入断言以访问其中一种或另一种样式。

答案 1 :(得分:4)

旧问题,但这是我如何为自己解决问题。

export interface Foo {
    [key: string]: any;
}

{ something: 0 } as Foo => valid

{ other: 'hello' } as Foo => valid

答案 2 :(得分:1)

不幸的是,似乎没有确切的答复,只有解决方案的近似值。

解决方案是在两个接口上使用交叉类型,一个定义静态元数据,一个定义动态键:

interface IStatic {
  staticflag: boolean;
}

interface IDynamic {
  [x: string]: string | number;
}

type Complex = IStatic & IDynamic;

const a: Complex = {
  staticflag: false,
  dynamic1: 'a',
};

答案 3 :(得分:0)

没有界面:

const myFunc = ((myObjectWithSomeKeys: { [key: string]: any }) => {
});