Typescript使用什么类型名称来表示一个变量的形式为“{}”?这对大多数人来说可能是超级明显的,但我是Typescript的新手,我正在转换一些Javascript,这个基本问题对谷歌来说出奇的困难。所有其他基本类型都有很好的文档,但我找不到基本散列类型的任何内容。我不确定是"object"还是"object"还是"Map"还是"any"。
zu0ti5jz1#
对于所有意图和目的 *,空对象类型({})可以与Object类型互换。具有属性的所有值(即不是null或undefined)可以分配给Object或{}。另一方面,object类型用于所有非primitive值,因此不能与Object或{}互换。Map<KeyType, ValueType>类型具体表示Map object。最后,any字面意思是 * 任何 * 值:它可以是一个基本类型,也可以不是,null,undefined,以及任何我没有在这里列出的类型。Difference between 'object' ,{} and Object in TypeScript更多尽管它们存在于TypeScript中,但你很可能不想在代码中使用{}或Object,有一个特定的eslint rule类型脚本提供了更多细节:当你输入一个值为{}时,它会警告你:不要使用{}作为类型。{}实际上意味着“任何非空值”。
{}
Object
null
undefined
object
Map<KeyType, ValueType>
any
Record<string, unknown>
unknown
Record<string, never>
使用Object时:不要使用Object作为类型。Object类型实际上意味着“任何非空值”,所以它比unknown稍微好一些。
.toString()
rqmkfv5c2#
{}是一个对象文字。TypeScript中的对象文字几乎可以定义任何类型的对象。示例中的 empty object literal(字面意思是{})等同于类型Object。但是一个带有属性的对象文字为一个带有这些属性的对象定义了一个可能匿名的类型,而不仅仅是Object。(有关{}、Object和object的更多信息,请参阅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链接没有任何东西表明obj是Example类型,但这没关系,因为它与Example是赋值兼容的,所以把它传递给fn是完全可以的。事实上,我们可以更进一步,明确地说obj是一个不同的类型:
obj
Example
fn
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链接在这里,我们已经明确地说obj是AnotherExample类型,它与Example(稍微)不同。但是将它传递给fn仍然是可以的,因为fn只需要对象具有Example的形状(a: number; b: string;),而obj就具有。它有一个多余的属性c,但这对fn来说并不重要。fn表示它只关心a和b。
AnotherExample
a: number; b: string;
c
a
b
2条答案
按热度按时间zu0ti5jz1#
对于所有意图和目的 *,空对象类型(
{}
)可以与Object
类型互换。具有属性的所有值(即不是null
或undefined
)可以分配给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
进行类型检查rqmkfv5c2#
{}
是一个对象文字。TypeScript中的对象文字几乎可以定义任何类型的对象。示例中的 empty object literal(字面意思是{}
)等同于类型Object
。但是一个带有属性的对象文字为一个带有这些属性的对象定义了一个可能匿名的类型,而不仅仅是Object
。(有关{}
、Object
和object
的更多信息,请参阅Emma Koskinen在their answer中链接的this answer。理解TypeScript类型系统的关键之一是它是 * 结构 *(基于事物的形状),而不是 * 名义 *(基于事物的名称)。例如:
Playground链接
没有任何东西表明
obj
是Example
类型,但这没关系,因为它与Example
是赋值兼容的,所以把它传递给fn
是完全可以的。事实上,我们可以更进一步,明确地说
obj
是一个不同的类型:Playground链接
在这里,我们已经明确地说
obj
是AnotherExample
类型,它与Example
(稍微)不同。但是将它传递给fn
仍然是可以的,因为fn
只需要对象具有Example
的形状(a: number; b: string;
),而obj
就具有。它有一个多余的属性c
,但这对fn
来说并不重要。fn
表示它只关心a
和b
。