打字稿: '{ 键(): 类型 }' vs '{ 键: () => 类型 }'

  • 本文关键字:类型 vs typescript
  • 更新时间 :
  • 英文 :


一位同事刚刚在 PR 中写了这篇文章,我很惊讶它有效,因为我从未见过语法。

这些之间有什么区别吗?

type x = {
    foo(): void;
    bar: () => void;
}
const x: x = {
    foo: () => { },
    bar: () => { }
}

游乐场链接

第一个(foo(): void;(是方法定义,第二个(bar: () => void;(是恰好是函数类型(() => void;(的字段定义

明显的区别是智能中用于代码完成的图标。

在大多数情况下,功能上没有区别。对于类,方法被分配给原型,而字段通常分配给实例,但这只是一个对象类型,所以函数的分配实际上取决于执行实现的对象,而不是类型本身。

就类型而言,一个很大的区别是strictFunctionTypes(pr(下的行为。它的要点是方法的行为是双变量的,而字段的行为是逆变的,所以下面的代码中只有一个错误:

type x = {
    foo(x: number | string): void;
    bar: (x: number | string) => void;
}
const x: x = {
    foo: (x: number) => { },// this is fine, methods are bivariant 
    bar: (x: number) => { } // err here, fields are contravariant  
}

就仅考虑类型而言,没有区别:

type x = {
    foo(): void;
    bar: () => void;
}

type Foo = x['foo'];
type Bar = x['bar'];
// both are () => void

通常,方法或箭头函数体内的this类型不是方法或箭头函数类型的一部分。

相关内容

最新更新