Typescript强制部分接口

时间:2016-08-29 14:29:58

标签: typescript

我有一个应用程序,我以JSON格式接收数据。一个简化的例子:

categoryBitMask

我早先知道数据会有多个 prop1 prop2 属性名称,但 COL_A12 COL_A13 生成,因此他们可以遵循其他命名(即 COL_A67 )。

我强制执行类似

的界面
data {
  prop1: "abc",
  prop2:  123,
  COL_A12: "mydata",
  COL_A13: "myotherdata",
}

但我无法在界面中指定其他属性的名称,因为我不知道确切的名称,尽管它们遵循一种模式。

有没有办法为Typescript中的属性名提供正则表达式?

1 个答案:

答案 0 :(得分:1)

您无法为属性名称设置模式 你能做的是:

interface IData {
    prop1: string;
    prop2: number;
    [name: string]: string | number;
}

所以这是有效的:

let data = {
    prop1: "abc",
    prop2:  123,
    COL_A12: "mydata",
    COL_A13: "myotherdata",
} as IData;

console.log(data.prop1); // ok
console.log(data.COL_A12); // error
console.log(data["COL_A12"]); // ok

问题是可索引属性的类型为string | number(因为它不能只是string,因为对象的prop2number) ,所以:

let a = data["COL_A12"]; // typeof a is 'string | number'
let b = data["COL_A12"] as string; // typeof a is 'string'

修改

当您收到数据时,您无法控制其中的内容(如果我理解正确的话),所以此界面只是为了了解您获得的数据及其结构。

如果您想控制在应用程序中访问此数据的方式,那么您可以创建一个获取此数据并公开特定getter的类,例如:

class Data {
    private raw: IData;

    constructor(data: IData) {
        this.raw = data;
    }

    public get prop1(): string {
        return this.raw.prop1;
    }

    public get prop2(): number {
        return this.raw.prop2;
    }

    public col(num: number): string {
        return this.raw[`COL_A${ num }`] as string;
    }
}