关于TS中描述Object类型的两种方式(类型签名和Record)


前言 :由于 Object 的范围很大,对象中属性可能是任意类型,而这时区分不出一个 Object 具体是什么类型。

所以一般不在 TS 中直接使用 Object 类型,而是以下两种方式描述对象:

  1. class / constructor
  2. typeinterface,推荐用这种,更灵活。

方式一:类型签名

举例 1:

type Obj = {
    [K: string]: number  //代表Obj中有一个字符串类型属性(具体属性名可以随便取只要是字符串就可),其属性值是数字。
}
    • 使用上有个共识,如果是泛型使用大写 K;若非泛型,是用小写 k。

上例基础上举例 2:

type Obj = {
    [K: string]: number
}

const a: Obj = {
    name: 1
    123: 6  //虽然使用type规定了属性名为string,而这里写了数字,但会编译通过。
}
    • 例子中属性名的命名为数字编译会通过,是因为在 JS 层面:所有属性名最终被都是字符串形式。

image-20230211093401215

由例 2 引申的例 3:JS 中一个矛盾的情况。 (👈🏻 看下面的总结,number 类型也可以)

type Obj = {
    [K: number]: number   //注意看这里,给属性名规定为number类型。
}

const a: Obj = {
    name: 1   //这里无法编译通过,因为JS中所有key都是字符串(string或symbol)。
    123: 6   //奇怪的在这行,既然key只能字符串但这里number居然编译通过了!!!!!
}

-

综上,总结

  • 对象中 key 的类型可以不是 string 吗?

    • 还可以是 symbol 或 number。

方式二:Record

其余待整理


文章作者: polariis
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 polariis !
评论
  目录