ts声明一个对象key很多,但是值只有string和number,如下写法是否可行,或者还有没有更好的写法

ts声明一个对象key很多,但是值只有string和number,如下写法是否可行,或者还有没有更好的写法

// 正常写法
export interface AssignmentList {
  deviceJobId: number
  damageType: number
  adressInfo: string
  deviceName: string
  latitude: string
  longitude: string
  feedBackFistTime: string
  //...
}
// ....
type AssignmentListString = 'adressInfo' | 'deviceName' | 'latitude' | 'longitude' | 'feedBackFistTime' // ...
type AssignmentListNumber = 'deviceJobId' | 'damageType'
export type AssignmentList = { [p in AssignmentListNumber]: number } & { [p in AssignmentListString]: string }
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    可以使用索引签名来声明该对象,就像参考资料中段落0的代码一样,同时支持string和number类型的索引签名可以混用。 具体实现步骤如下: 1. 使用interface关键字定义一个新的接口。 2. 在接口内使用索引签名,key的类型设为string,值的类型为string和number联合类型。 3. 初始化一个空对象,并将其类型声明为这个新接口类型。 4. 给该对象赋值时,key可以是任意字符串(必须是string类型),也可以是任意数字(必须是number类型),值可以是字符串或数字。 例如:

    interface MyObj {
      [key: string]: string | number;
    }
    
    const myObj: MyObj = {};
    myObj['name'] = 'Tom';
    myObj['age'] = 18;
    myObj[1] = 'one'; // 编译器不会报错,但是不推荐将数字作为key
    

    需要注意的是,由于Javascript的隐式类型转换,如果使用数字作为key,会将其转换为字符串。因此,虽然不会报错,但是无法像字符串key一样直接访问该属性。同时,不推荐使用数字作为key。 至于段落3的内容,不建议使用String和Number来表示数据类型,建议使用小写的string和number关键字。这两者之间的区别在于,String和Number是JS内置的构造函数,不是基本的数据类型,不同于string和number这两个基本数据类型,因此不建议使用。同时,TS会将它们解释为构造函数类型,比较麻烦。 段落4中的示例也展示了如何自定义Props类型。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^