一位同事刚刚在PR中写了这篇文章,我惊讶,因为我从未见过这种语法。
这些之间有什么区别吗?
type x = {
foo(): void;
bar: () => void;
}
const x: x = {
foo: () => { },
bar: () => { }
}
答案 0 :(得分:6)
第一个(foo(): void;
)是方法定义,第二个(bar: () => void;
)是字段定义,碰巧是函数类型(() => void;
)
明显的区别是intelisene中用于代码完成的图标。
在大多数情况下,功能上没有区别。对于类,方法是分配给原型的,而字段通常是分配给实例的,但这只是一个对象类型,因此分配功能的确取决于对象,而不是类型本身。
就类型而言,最大的不同是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
}
答案 1 :(得分:1)
只考虑类型,没有区别:
type x = {
foo(): void;
bar: () => void;
}
type Foo = x['foo'];
type Bar = x['bar'];
// both are () => void
通常,方法或箭头函数主体内的this
类型不属于方法或箭头函数类型。