优先使用函数类型
强制使用函数类型而不是带有调用签名的接口。
🎨
在 "plugin:@typescript-eslint/stylistic"
中扩展 ESLint 配置 将启用此规则。
🔧
此规则报告的一些问题可以通过 --fix
ESLint 命令行选项 自动修复。
TypeScript 允许两种常见的声明函数类型的方式
- 函数类型:
() => string
- 带有签名的对象类型:
{ (): string }
函数类型形式通常更简洁,因此在可能的情况下更受欢迎。
此规则建议使用函数类型,而不是带有单个调用签名的接口或对象类型字面量。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/prefer-function-type": "error"
}
};
在游乐场中尝试此规则 ↗
示例
- ❌ 不正确
- ✅ 正确
interface Example {
(): string;
}
在游乐场中打开function foo(example: { (): number }): number {
return example();
}
在游乐场中打开interface ReturnsSelf {
// returns the function itself, not the `this` argument.
(arg: string): this;
}
在游乐场中打开type Example = () => string;
在游乐场中打开function foo(example: () => number): number {
return bar();
}
在游乐场中打开// returns the function itself, not the `this` argument.
type ReturnsSelf = (arg: string) => ReturnsSelf;
在游乐场中打开function foo(bar: { (): string; baz: number }): string {
return bar();
}
在游乐场中打开interface Foo {
bar: string;
}
interface Bar extends Foo {
(): void;
}
在游乐场中打开// multiple call signatures (overloads) is allowed:
interface Overloaded {
(data: string): number;
(id: number): string;
}
// this is equivelent to Overloaded interface.
type Intersection = ((data: string) => number) & ((id: number) => string);
在游乐场中打开选项
此规则不可配置。
何时不使用它
如果您出于风格原因特别想使用带有单个调用签名的接口或类型字面量,则可以避免此规则。
此规则有一个已知的边缘情况,有时会触发全局增强,例如 interface Function
。这些边缘情况很少见,通常是奇怪代码的症状。我们建议您使用 内联 ESLint 禁用注释。有关详细信息,请参阅 #454。