【问题标题】:What does {} mean in TypeScript?{} 在 TypeScript 中是什么意思?
【发布时间】:2020-06-08 10:06:27
【问题描述】:

我猜这意味着空对象,但不确定...

我在 https://www.typescriptlang.org/docs/handbook/basic-types.html 上找不到该类型。

interface Component<P = {}, S = {}, SS = any> extends ComponentLifecycle<P, S, SS> { }

【问题讨论】:

标签: typescript


【解决方案1】:

{} 类型并不完全意味着“空对象”,因为其他类型的对象(可能不是空的)可以分配给类型{}。例如:

function acceptsEmpty(obj: {}): void {
    console.log(obj);
}

let notEmpty: {a: string} = {a: 'test'};

// no error; {a: string} is assignable to {}
acceptsEmpty(notEmpty);

所以本质上,{} 类型的意思是“不需要有任何属性,但可能有一些”,同样{a: string} 类型的意思是“必须有一个名为a 的属性,其值为string ,但也可能有其他属性”。

所以{} 对其值几乎没有任何限制;唯一的规则是它不能是nullundefined。在这方面它类似于object 类型,只是object 也禁止原始值,而{} 允许它们:

// no error
let anything: {} = 1;

// error: Type '1' is not assignable to type 'object'.
let noPrimitivesAllowed: object = 1;

Playground Link

【讨论】:

  • 感谢您的回答。你知道我为什么会收到以下错误吗? Type 'SFC&lt;AnchorProps&gt;' is not assignable to type 'string | SFC&lt;{}&gt; | ComponentClass&lt;{}, any&gt;'.
  • 因为即使AnchorProps{} 的子类型,泛型类型SFC 也不能以SFC&lt;AnchorProps&gt;SFC&lt;{}&gt; 的子类型的方式定义。比较例如List&lt;Integer&gt; 不是 Java 中 List&lt;Object&gt; 的子类型,因为对象列表允许添加字符串,但整数列表不允许。您将不得不问另一个问题,并显示SFCAnchorProps 的定义。
  • 感谢您的建议。完毕。 stackoverflow.com/questions/60382399/…
  • 您的回答并不完全正确。 {} 类型 空对象。事实上,很多东西都可以分配给它,并不是因为{} 可能有属性,而是因为扩展这个类型的所有东西都可以分配给它。
  • @GuerricP 我不知道您试图在可分配给类型A 的对象和具有扩展B 的类型的对象之间做出什么区分@ 987654351@。这些是等价的条件。不管怎样,{} 类型的东西不一定是空对象。可分配给{} 的对象集不是空对象集。
【解决方案2】:

Component&lt;P = {}, S = {}, SS = any&gt; 表示 P 和 S 的默认类型为空对象。

所以你可以像这样使用带有 0..3 个通用参数的接口:

const a: Component  // = Component<{},{},any>
const b: Component<SomeType>  // = Component<Some,{},any>
const c: Component<SomeType, SomeOtherType>  // = Component<SomeType, SomeOtherType, any>
const d: Component<SomeType, SomeOtherType, []>  // = Component<SomeType, SomeOtherType, []>

【讨论】:

  • 感谢您的回答。这是否意味着P 默认为一个空对象并且是object 类型与SS 默认类型为any 并且是any 类型?很难把我的想法包裹在这个问题上。
  • @sunknudsen 不,它不默认为任何内容。它不是一个定义,它是一种类型。
猜你喜欢
  • 2019-02-24
  • 2016-11-03
  • 2019-04-02
  • 2015-01-12
  • 2020-04-19
  • 2019-08-18
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多