首页 > 解决方案 > Typescript - 始终以字符串或数字结尾的通用对象类型

问题描述

打字稿中是否有一种方法可以制作一个可以有很多层次但仍然始终以字符串或数字属性值结尾的通用对象。

interface GenericObject {
  [key: string]: string | number | GenericObject | GenericObject[];
}

const object: GenericObject = {
  test: 'test',
  testNum: 2,
  test2: {
    test: 'test'
  },
  test3: [
    {
      test: 'test'
    }
  ]
}

这样的东西在创建对象时可以正常工作,但是在尝试访问属性时会引发错误。

object.test2.test;
object.test3[0].test;

类型“字符串”上不存在属性“测试”| 号码 | 通用对象 | 通用对象[]'

有没有办法让这个工作,所以你可以无限深的层次,但总是以字符串或数字结尾?

Playground url - https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgOIRNYCDyAjAKwgTGQG8BYAKGWQG0BrCATwC5kBnMKUAcwF12XHiF7IAPshABXALZ5oEtBiy5CxUpPSYeaoiTr8A3NQC+1aggD2ILsivqS7bavz7SAXnLVakLuwByPzAAgBofZGCAOTl2ACZwmkiILjj2SiTfFLBA4ICI00SsrgBmdjoI2gzaGuT-ZCDs-MzkcyT+MwsqB3cAOmC4-uyTbscwIdK6AAZ+CbAjIA

标签: typescripttypescript-genericstype-constraints

解决方案


我不是 TS 专家(还)。但是,我认为你的定义没有错。

问题在于,在 TS 中,您只能访问保证在联合类型的所有组成部分中的成员。

因此,您收到此类错误是有道理的。类型 number、string 和一些 GenericObject 接口之间没有足够的重叠。TS 不知道 test2 变量是原始变量还是带有一些键的对象。

告诉 TS test2 或 test3 道具是什么(在访问位置)的一种方法是通过as重新映射密钥

(object.test2 as GenericObject).test;

并保持object: GenericObject原样。只是我的两分钱。我很高兴看到其他人建议作为您问题的解决方案(无限深的对象)。


推荐阅读