TypeScript 4.4 发布后,您将能够利用 template string pattern literal index signatures,如在 microsoft/TypeScript#44512 中实现的那样,然后这将起作用:
// TS4.4+
interface MyObject {
name: string;
[k: `added_${string}`]: number[];
[k: `removed_${string}`]: number[];
}
const myObject: MyObject = {
name: "",
added_abc: [1, 2, 3],
added_bcd: [2],
removed_abcd: [4, 5],
removed_xyz: [],
} // okay
const myBadObject: MyObject = {
name: "",
added_abc: [1, 2, 3],
addled_bcd: [2], // error!
}
在此之前,TypeScript 中没有特定类型可以代表您的要求。您可以在 TS4.1 到 TS4.3 中使用带有模板文字类型的 generic 辅助函数,但此类函数更复杂:
// TS 4.1-4.3
const asMyObject = <T extends { name: string } & { [K in keyof T]:
K extends `added_${string}` | `removed_${string}` ? number[] :
K extends "name" ? string :
never }>(t: T) => t;
const myObject2 = asMyObject({
name: "",
added_abc: [1, 2, 3],
added_bcd: [2],
removed_abcd: [4, 5],
removed_xyz: [],
}); // okay
const myBadObject2 = asMyObject({
name: "",
added_abc: [1, 2, 3],
addled_bcd: [2], // error!
});
Playground link to code