理想情况下,将它们拆分为RecordDto
上的子对象,而不是直接在RecordDto
上.(例如,类型为Record<string, {isMove: boolean; tabName: string; }>
的tabs
属性.)但如果你不能或不想这样做:
如果您可以根据索引键的名称将其与其他键区分开来,则只需稍加调整即可正常工作.例如,您的密钥是一个后跟_tab
的数字,并且您的其他属性都不符合该模式,因此template literal type适用于索引签名的密钥,并将其与其他属性名称区分开来:
type RecordDto = {
organizationId?: string;
displayName?: string;
photo?: string | null;
[key: `${number}_tab`]: { isMove:boolean, tabName: string };
// ^^^^^^^^^^^^^^^
};
Playground link
如果您将这些值作为字符串接收,并且需要使用它们来索引到类型中,那么您需要告诉TypeScript它们可用作索引键.为此,您可以使用类型保护功能:
function isValidTabName(name: string): name is `${number}_tab` {
return /*...validation logic...*/;
}
...或类型断言函数:
function assertIsValidTabName(name: string): asserts name is `${number}_tab` {
if (! /*...validation logic...*/) {
throw new Error(`The value "${name}" is not a valid tab key`);
}
}
你这样使用它们:
function addTable(dto: RecordDto, tabKey: string, isMove: boolean, tabName: string) {
assertIsValidTabName(tabKey);
dto[tabKey] = {isMove, tabName};
}
(如果使用类型保护功能,则使用if (isValidTabName(tabKey))
;该键在true
分支中有效.)
Playground link