开发者问题收集

如何在 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个回答

您有一些选择:

  1. 您可以使用 index签名类型 允许任何字符串或任何数字,例如:

     让MyObj:{[key:string]:number} = {};
    myobj [prop] = value; 

    ...允许任何字符串属性名称,其值为数字。 (或者您可以使用 {[键:号码]:number} 来制作键号。 字符串number 是您唯一的两个索引签名选项。)

  2. 您可以使用<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; 
  3. 您可以使用 map 而不是对象:

     让Myobj:map&lt; string,number&gt; = new Map();
    myobj.set(prop,value); 

在所有三个中, number ,因为值类型只是一个示例,它可以是您想要的任何类型(包括 inmountype )或 未知 如果您不知道类型,或者 如果您想允许任何类型。

这可能很明显,但是我无论如何都会说:这确实意味着打字稿无法帮助您在对象上使用错误的属性名称。 :-)但是,如果属性名称是运行时的东西,那是不可避免的。

2021-12-15