一位同事刚刚在 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
类型不是方法或箭头函数类型的一部分。