如何在typescript中使用其他静态键类型制作动态键.

{
"organizationId": "NEW_ORG",
"displayName": "Test Display",
"photo": null,
"1645661283562_tab": {
    "isMove": false,
    "tabName": "Activities",
    }
}

我有一个静态类型的其他关键点,但1645661283562_标签是动态的,如何使这种类型的对象类型?

type RecordDto = {
  organizationId?: string;
  displayName?: string;
  photo?: string | null;
  [key: string]: { isMove:boolean, tabName: string };
};

这不管用.有什么解决办法吗?

推荐答案

理想情况下,将它们拆分为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

Javascript相关问答推荐

成帧器运动中的运动组件为何以收件箱开始?

通过在页面上滚动来移动滚动条

Google Apps脚本中的discord邀请API响应的日期解析问题

Redux查询多个数据库Api reducerPath&

为什么这个JS模块在TypeScript中使用默认属性导入?""

如何在输入元素中附加一个属性为checkbox?

使用Java脚本导入gltf场景并创建边界框

使用Google API无法进行Web抓取

更改预请求脚本中重用的JSON主体变量- Postman

本地库中的chartjs-4.4.2和chartjs-plugin-注解

MarkLogic-earch.suggest不返回任何值

有效路径同时显示有效路径组件和不存在的路径组件

ngOnChanges仅在第二次调用时才触发

如何在TransformControls模式下只保留箭头进行翻译?

在单击按钮时生成多个表单时的处理状态

有角粘桌盒阴影

如何阻止外部脚本进入顶层导航

无法在Adyen自定义卡安全字段创建中使用自定义占位符

如何调整下拉内容,使其不与其他元素重叠?

错误400:当我试图在React中使用put方法时,该字段是必需的