【问题标题】:Typescript empty object and any difference打字稿空对象和任何区别
【发布时间】:2020-08-09 17:43:26
【问题描述】:

有人能解释一下{}any 之间的区别吗?

例如,将通用接口参数设置为Interface<{}>Interface<any> 之间的区别。

有什么想法吗?

【问题讨论】:

标签: typescript


【解决方案1】:

要更好地理解{} 的含义,请查看https://blog.mariusschulz.com/2017/02/24/typescript-2-2-the-object-type

{} 是顶级类型。这是什么意思 ?如果您将某些内容注释为{},则它可以是以下任何一种类型:string | number | boolean | object | {[key:string]: any} | Object | any[]

const test1: {} = 'hello'
const test2: {} = 123
const test3: {} = false
const test4: {} = {foo:'bar'}

虽然null | undefined是不允许的

// Expect errors
const test6: {} = null
const test7: {} = undefined

Playground link

any 完全关闭类型检查器,你可以做任何“疯狂”的事情,你已经习惯了 vanilla JS。专业提示:不要在家里使用这个 :) 一定要在 ts-lint 中使用 no-any 规则

【讨论】:

  • 这似乎是正确的,但它在文档中的什么地方明确指出上述类型是兼容的?似乎在任何地方都找不到...
  • 文档中没有提及,因为 typescript 有新的“替换”作为公共 API - 称为 unknown,应该使用它。 - 所以 {} 是以前的底部类型(相当私有的 TS API) - 由于引入了 unknownunknown 是新的底部类型,应该只使用
【解决方案2】:

所以 JavaScript 中有类型。比如numberstringobjectbooleanany 匹配任何这些类型。 {} 只匹配一个空的object

function fn1(foo: any): void {}
function fn2(foo: {}): void {}

fn1(23); // OK
fn1('test'); // OK
fn1(undefined); // OK
fn2({}); // OK
fn2(23); // Not OK
fn2(null); // Not OK

【讨论】:

  • any 不仅仅是另一种类型,any 禁止类型检查:function f(): any { }; let a = f(); a.whatever.ever.ever() 编译时不会出错。
  • 看来{}实际上不只是匹配一个空对象,而是似乎相当于object。所以你的例子fn2(23)实际上并没有引起任何错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2017-10-12
  • 2018-11-06
  • 1970-01-01
  • 2021-12-01
  • 2016-08-13
  • 1970-01-01
相关资源
最近更新 更多