You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:39:53