typescript:`{key():type}`vs`{key:()=> type}`

时间:2019-06-11 21:29:18

标签: typescript

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

这些之间有什么区别吗?

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

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

playground link

2 个答案:

答案 0 :(得分:6)

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

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

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

就类型而言,最大的不同是strictFunctionTypespr)下的行为。其要点是方法的行为是双向的,而字段的行为是双向的,因此下面的代码中只有一个是错误:

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  
}

答案 1 :(得分:1)

只考虑类型,没有区别:

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


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

通常,方法或箭头函数主体内的this类型不属于方法或箭头函数类型。