@typescript-eslint/member-ordering接口成员排序报错异常排查
解决ESLint
@typescript-eslint/member-ordering 接口成员顺序报错 问题详情
报错提示:
Member 'expectStatusCodeToBe' should be declared before member 'statusCode'
涉及的TypeScript接口代码:
export interface IHttpResponse { get statusCode(): HttpStatusCode; expectStatusCodeToBe(statusCode: HttpStatusCode): void; }
已配置@typescript-eslint/member-ordering规则,要求方法声明在getter之后,但该报错仅在接口中出现,推测接口存在特殊处理逻辑。当前规则配置如下:
"@typescript-eslint/member-ordering": [ "error", { "default": { "memberTypes": [ // Fields "public-static-field", "protected-static-field", "private-static-field", "#private-static-field", "public-decorated-field", "protected-decorated-field", "private-decorated-field", "public-instance-field", "protected-instance-field", "private-instance-field", "#private-instance-field", "public-abstract-field", "protected-abstract-field", "public-field", "protected-field", "private-field", "#private-field", "static-field", "instance-field", "abstract-field", "decorated-field", "field", // Static initialization "static-initialization", // Constructors "public-constructor", "protected-constructor", "private-constructor", "constructor", // Index signature "signature", "call-signature", // Accessors "public-static-accessor", "protected-static-accessor", "private-static-accessor", "#private-static-accessor", "public-decorated-accessor", "protected-decorated-accessor", "private-decorated-accessor", "public-instance-accessor", "protected-instance-accessor", "private-instance-accessor", "#private-instance-accessor", "public-abstract-accessor", "protected-abstract-accessor", "public-accessor", "protected-accessor", "private-accessor", "#private-accessor", "static-accessor", "instance-accessor", "abstract-accessor", "decorated-accessor", "accessor", // Getters "public-static-get", "protected-static-get", "private-static-get", "#private-static-get", "public-decorated-get", "protected-decorated-get", "private-decorated-get", "public-instance-get", "protected-instance-get", "private-instance-get", "#private-instance-get", "public-abstract-get", "protected-abstract-get", "public-get", "protected-get", "private-get", "#private-get", "static-get", "instance-get", "abstract-get", "decorated-get", "get", // Setters "public-static-set", "protected-static-set", "private-static-set", "#private-static-set", "public-decorated-set", "protected-decorated-set", "private-decorated-set", "public-instance-set", "protected-instance-set", "private-instance-set", "#private-instance-set", "public-abstract-set", "protected-abstract-set", "public-set", "protected-set", "private-set", "#private-set", "static-set", "instance-set", "abstract-set", "decorated-set", "set", // Methods "public-static-method", "protected-static-method", "private-static-method", "#private-static-method", "public-decorated-method", "protected-decorated-method", "private-decorated-method", "public-instance-method", "protected-instance-method", "private-instance-method", "#private-instance-method", "public-abstract-method", "protected-abstract-method", "public-method", "protected-method", "private-method", "#private-method", "static-method", "instance-method", "abstract-method", "decorated-method", "method" ], "order": "alphabetically-case-insensitive" } } ]
原因分析
@typescript-eslint/member-ordering 对接口和类的成员分类逻辑不同:
- 类中的getter会被归类为
get类型,遵循配置的顺序(getter在前,方法在后)。 - 接口中的getter会被识别为
signature(签名)类型,当前默认规则里signature排在get之前,同时开启了alphabetically-case-insensitive字母排序。由于expectStatusCodeToBe的首字母e在statusCode的s之前,规则强制要求方法排在getter前面,从而触发报错。
解决方案
方案1:为接口单独配置成员顺序(推荐)
在规则配置中添加interface字段,自定义接口的成员排序规则,指定方法在签名之后,并且关闭字母排序(或按需求调整):
"@typescript-eslint/member-ordering": [ "error", { "default": { // 保留原有的默认配置不变 }, "interface": { "memberTypes": [ "signature", "method" ], "order": "as-written" // 按代码编写顺序校验,不强制字母排序 } } ]
这样接口中的getter(signature)会排在方法之前,且遵循代码编写顺序,不会触发字母排序冲突。
方案2:调整接口成员的编写顺序
如果必须保留字母排序规则,只能将expectStatusCodeToBe方法移到statusCode getter之前:
export interface IHttpResponse { expectStatusCodeToBe(statusCode: HttpStatusCode): void; get statusCode(): HttpStatusCode; }
但此方案不符合“方法在getter之后”的需求,仅作为备选。
内容的提问来源于stack exchange,提问作者SonOfPirate
相关产品推荐
相关产品推荐

