method-signature-style
强制使用特定的方法签名语法。
🔧
此规则报告的一些问题可以通过 --fix
ESLint 命令行选项 自动修复。
TypeScript 提供两种方法来定义对象/接口函数属性
interface Example {
// method shorthand syntax
func(arg: string): number;
// regular property with function type
func: (arg: string) => number;
}
两者非常相似;大多数情况下,使用哪一个并不重要。
一个好的做法是使用 TypeScript 的 strict
选项(它意味着 strictFunctionTypes
),这将为函数属性启用正确的类型检查(方法签名将获得旧的行为)。
TypeScript 常见问题解答
相同类型的方法和函数属性的行为不同。方法在其参数中始终是双变的,而函数属性在其参数中是逆变的,前提是
strictFunctionTypes
。
有关此背后的原因,请参阅 编译器选项的 TypeScript PR。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/method-signature-style": "error"
}
};
在游乐场中尝试此规则 ↗
选项
此规则接受以下选项
type Options = ['method' | 'property'];
const defaultOptions: Options = ['property'];
此规则接受一个字符串选项
"property"
:强制使用属性签名来表示函数。使用此选项来强制最大程度的正确性,以及 TypeScript 的严格模式。"method"
:强制使用方法签名来表示函数。如果您没有使用 TypeScript 的严格模式,并且更喜欢这种风格,请使用此选项。
默认值为 "property"
。
property
使用 property
选项的代码示例。
- ❌ 错误
- ✅ 正确
interface T1 {
func(arg: string): number;
}
type T2 = {
func(arg: boolean): void;
};
interface T3 {
func(arg: number): void;
func(arg: string): void;
func(arg: boolean): void;
}
在游乐场中打开interface T1 {
func: (arg: string) => number;
}
type T2 = {
func: (arg: boolean) => void;
};
// this is equivalent to the overload
interface T3 {
func: ((arg: number) => void) &
((arg: string) => void) &
((arg: boolean) => void);
}
在游乐场中打开method
使用 method
选项的代码示例。
- ❌ 错误
- ✅ 正确
何时不使用它
如果您不想为对象/接口函数类型强制执行特定样式,或者您没有使用strictFunctionTypes
,那么您不需要此规则。
但是,请记住,不一致的样式会损害项目的可读性。我们建议为您的项目选择最适合的单个选项。