typescript - TS接口(interface)静态名称和[key : string]

标签 typescript

interface P{
  data: {
    sub: number
    [key: string]: {
      arr: Array<number>
    }
  }
}

我的数据可能是

data = { 
  sub: 1,
  DYNAMIC1: [1,2,3],
  DYNAMIC2: [3,4,5]
}

data = { 
  sub: 1,
  RANDOM1: [3],
  DYNAMIC1: [9,0,0]
}

我的 IDE 抛出了这个错误信息

Property 'sub' of type 'number' is not assignable to string index type '{ arr: number[]; }'.ts(2411)

如何同时使用静态属性名称和动态属性

已添加

我已经使用了|,但是另一个代码仍然出错。

{
  data[key].map((num:number, index:number)=> ...) // key can not be `sub`. key always be the type `Array<number>`
}

上面的代码抛出了这个错误信息

Property 'map' does not exist on type 'number | number[]'. Property 'map' does not exist on type 'number'.ts(2339)

最佳答案

您正在定义一个索引签名,它强制所有属性的返回类型与索引签名返回类型相匹配。但是,您可以使用联合运算符修复它,例如

interface P {
  data: {
    [key: string]: number | Array<number>;
  };
}

如果您想将 sub 保留为已定义的属性,则必须使用 number 的具体类型扩展索引,例如

interface P{
  data: {
    sub: number
    [key: string]: Array<number> | number
  }
}

关于typescript - TS接口(interface)静态名称和[key : string],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58436437/

相关文章:

function - 在不调用 typescript 中的函数的情况下获取泛型函数的类型

angular - 如何在 RxJS/Angular 的两个不同点捕获错误?

javascript - 如何在函数组件中定义 Type 的属性? TS2339 错误

javascript - 类型缺少调用签名

javascript - typescript : 'new' 表达式,其目标缺少构造签名,隐式具有 'any' type.ts(7009)

javascript - 在 Luxon 中像持续时间一样解析 ISO 8601

import - 是否可以在 typescript 中导入 *

node.js - Platypi 中 ViewControl 的注册函数放在哪里

Javascript 类未在 Visual Studio Code 中获取 TypeScript 声明文件

javascript - TypeScript 和运行时类型检查,2020 年的简单解决方案