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 }
不知道你这个问题是否已经解决, 如果还没有解决的话:可以使用索引签名来声明该对象,就像参考资料中段落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类型。