如何在 TypeScript 中定义一个空对象
2021-12-15
7627
背景
被 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
但是我们事先不知道属性的名称。
1个回答
您有一些选择:
-
您可以使用 index签名类型 允许任何字符串或任何数字,例如:
让MyObj:{[key:string]:number} = {}; myobj [prop] = value;
...允许任何字符串属性名称,其值为数字。 (或者您可以使用
{[键:号码]:number}
来制作键号。字符串
和number
是您唯一的两个索引签名选项。) -
您可以使用<a href="https://www.typescriptlang.org/docs/handbook/handbook/utility-types.html#recordkeys-type" rel="noreferrer“> /code>实用程序类型 ,例如
record&lt; string,number&gt;
,它与上面的事情大致相同:让MyObj:record&lt;字符串,数字&gt; = {}; myobj [prop] = value;
-
您可以使用
map
而不是对象:让Myobj:map&lt; string,number&gt; = new Map(); myobj.set(prop,value);
在所有三个中,
number
,因为值类型只是一个示例,它可以是您想要的任何类型(包括
inmountype
)或
未知
如果您不知道类型,或者
如果您想允许任何类型。
这可能很明显,但是我无论如何都会说:这确实意味着打字稿无法帮助您在对象上使用错误的属性名称。 :-)但是,如果属性名称是运行时的东西,那是不可避免的。
2021-12-15