typescript - 如何在 typescript 中定义一个空对象

标签 typescript

背景

坚持 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 signature type允许任何字符串或任何数字,例如:

    let myObj: {[key: string]: number} = {};
    myObj[prop] = value;
    

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

  2. 您可以使用 Record utility type ,例如 Record<string, number>它与上面的功能大致相同:

    let myObj: Record<string, number> = {};
    myObj[prop] = value;
    
  3. 您可以使用 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/

相关文章:

typescript - 找不到模块 './..../x.html' - TsLint/Angular-Meteor

typescript - 从 fork 安装 @types 定义

node.js - 带有 .validate() 的 Mocha 测试模式不返回

typescript - 检查变量是否是 typescript 联合中的特定接口(interface)类型

reactjs - 如何解决: "Definition for rule ' @typescript-eslint/consistent-type-assertions' was not found"

javascript - angular-cli 编译错误 + monorepo : error TS2451: Cannot redeclare block-scoped variable 'ngDevMode'

python - SHA256 在 Python 与 TypeScript 中散列正文和 base64 编码

html - 在 Angular 中执行函数之前如何等待最后一次击键?

javascript - typescript 定义文件无法使方法实现对象接口(interface)

typescript - Openlayers:LineString 上的渐变发光