背景
坚持 typescript 。我理解这个声明:
let varName:number; //null,string,..declare simple variables.
let arrName:string[] // or arrName:number[]. etc
显然这用于对象:
//knowing type of the property
let obj: {property:string, also:number[]} = {property:'hello', also:[1,2,3]}
//now knowing the type of the property
let obj: {property:any, also:any[]} = {property: a && b || c, also:[1,'string', 'etc']}
但是如果我们事先不知道属性的名称会怎样呢?
特别是,我正在尝试翻译这个 JS 位:
let myObj = {}
myObj[prop] = value
但我们事先并不知道属性的名称。
最佳答案
您有几个选择:
您可以使用 index signature type允许任何字符串或任何数字,例如:
let myObj: {[key: string]: number} = {}; myObj[prop] = value;
...允许任何字符串属性名称,其值应为数字。 (或者您可以使用
{[key: number]: number}
来制作 key 编号。string
和number
是您仅有的两个索引签名选项。)您可以使用
Record
utility type ,例如Record<string, number>
它与上面的功能大致相同:let myObj: Record<string, number> = {}; myObj[prop] = value;
您可以使用
Map
而不是对象:let myObj: Map<string, number> = new Map(); myObj.set(prop, value);
在所有这三个中,number
由于值类型只是一个示例,它可以是您想要的任何类型(包括 union type )或 unknown
如果你不知道类型,或者 any
如果你想允许任何类型。
这可能很明显,但我还是要说:这确实意味着 TypeScript 无法帮助您在对象上使用错误的属性名称。 :-) 但如果属性名称是运行时的东西,那是不可避免的。
关于typescript - 如何在 typescript 中定义一个空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70367555/