我有一个应用程序,我以JSON格式接收数据。一个简化的例子:
categoryBitMask
我早先知道数据会有多个 prop1 和 prop2 属性名称,但 COL_A12 和 COL_A13 生成,因此他们可以遵循其他命名(即 COL_A67 )。
我强制执行类似
的界面data {
prop1: "abc",
prop2: 123,
COL_A12: "mydata",
COL_A13: "myotherdata",
}
但我无法在界面中指定其他属性的名称,因为我不知道确切的名称,尽管它们遵循一种模式。
有没有办法为Typescript中的属性名提供正则表达式?
答案 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
,因为对象的prop2
是number
) ,所以:
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;
}
}