Typescript为{}使用什么类型名称?

rkttyhzu  于 2023-06-24  发布在  TypeScript
关注(0)|答案(2)|浏览(109)

Typescript使用什么类型名称来表示一个变量的形式为“{}”?
这对大多数人来说可能是超级明显的,但我是Typescript的新手,我正在转换一些Javascript,这个基本问题对谷歌来说出奇的困难。所有其他基本类型都有很好的文档,但我找不到基本散列类型的任何内容。我不确定是"object"还是"object"还是"Map"还是"any"。

zu0ti5jz

zu0ti5jz1#

对于所有意图和目的 *,空对象类型({})可以与Object类型互换。具有属性的所有值(即不是nullundefined)可以分配给Object{}
另一方面,object类型用于所有非primitive值,因此不能与Object{}互换。
Map<KeyType, ValueType>类型具体表示Map object
最后,any字面意思是 * 任何 * 值:它可以是一个基本类型,也可以不是,null,undefined,以及任何我没有在这里列出的类型。
Difference between 'object' ,{} and Object in TypeScript更多
尽管它们存在于TypeScript中,但你很可能不想在代码中使用{}Object,有一个特定的eslint rule类型脚本提供了更多细节:
当你输入一个值为{}时,它会警告你:不要使用{}作为类型。{}实际上意味着“任何非空值”。

  • 如果你想要一个表示“任何对象”的类型,你可能想要Record<string, unknown>
  • 如果你想要一个表示“任何值”的类型,你可能需要unknown
  • 如果你想要一个表示“空对象”的类型,你可能想要Record<string, never>

使用Object时:不要使用Object作为类型。Object类型实际上意味着“任何非空值”,所以它比unknown稍微好一些。

  • 如果你想要一个表示“任何对象”的类型,你可能想要Record<string, unknown>
  • 如果你想要一个表示“任何值”的类型,你可能需要unknown
  • 空对象类型和Object类型实际上在编译时语义上有所不同:内置方法(如.toString())不是针对{}进行类型检查,而是针对Object进行类型检查
rqmkfv5c

rqmkfv5c2#

{}是一个对象文字。TypeScript中的对象文字几乎可以定义任何类型的对象。示例中的 empty object literal(字面意思是{})等同于类型Object。但是一个带有属性的对象文字为一个带有这些属性的对象定义了一个可能匿名的类型,而不仅仅是Object。(有关{}Objectobject的更多信息,请参阅Emma Koskinen在their answer中链接的this answer
理解TypeScript类型系统的关键之一是它是 * 结构 *(基于事物的形状),而不是 * 名义 *(基于事物的名称)。例如:

interface Example {
    a: number;
    b: string;
}
function fn(x: Example) {
    console.log(x.a, x.b);
}

const obj = {a: 42, b: "Life, the Universe, and Everything"};
fn(obj); // <=== No error here

Playground链接
没有任何东西表明objExample类型,但这没关系,因为它与Example是赋值兼容的,所以把它传递给fn是完全可以的。
事实上,我们可以更进一步,明确地说obj是一个不同的类型:

interface Example {
    a: number;
    b: string;
}
function fn(x: Example) {
    console.log(x.a, x.b);
}

interface AnotherExample {
    a: number;
    b: string;
    c: boolean;
}

const obj: AnotherExample = {a: 42, b: "Life, the Universe, and Everything", c: true};
fn(obj); // <=== No error here

Playground链接
在这里,我们已经明确地说objAnotherExample类型,它与Example(稍微)不同。但是将它传递给fn仍然是可以的,因为fn只需要对象具有Example的形状(a: number; b: string;),而obj就具有。它有一个多余的属性c,但这对fn来说并不重要。fn表示它只关心ab

相关问题