跳至主要内容

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;
}
在游乐场中打开

method

使用 method 选项的代码示例。

interface T1 {
func: (arg: string) => number;
}
type T2 = {
func: (arg: boolean) => void;
};
在游乐场中打开

何时不使用它

如果您不想为对象/接口函数类型强制执行特定样式,或者您没有使用strictFunctionTypes,那么您不需要此规则。

但是,请记住,不一致的样式会损害项目的可读性。我们建议为您的项目选择最适合的单个选项。

资源