【问题标题】:Any standard way in @typescript-eslint to cast a return value to 'any' without getting 'no-explicit-any' warning?@typescript-eslint 中的任何标准方法都可以将返回值转换为 'any' 而不会收到 'no-explicit-any' 警告?
【发布时间】:2020-03-25 11:15:25
【问题描述】:
// I get @typescript-eslint of [Unexpected any. Specify a different type.eslint(@typescript-eslint/no-explicit-any)]

const funcToGetOnlineData: (url: string) => any = () => {
    // const httpData = (some processes to retrieve http request data)
    // return httpData;
};

funcToGetOnlineData('http://getsomedata.com');

我知道将返回值转换为 any 不是一个好习惯。但是,有时我们确实需要这个。即通过 HTTP 请求获取形状未知的数据。在不禁用这些行的 ESlint 规则的情况下,是否有任何标准方法/实践来摆脱这种情况?

【问题讨论】:

  • 为什么不改用unknown 类型呢?
  • @CRice 因为使用unknown的限制太多。例如1.Type 'unknown' is not assignable to type 'string'.ts(2322),2.Object is of type 'unknown'.ts(2571)。 unknown 类型太难操作,因为它不能分配给其他变量。
  • 您能举个例子,为什么要保留any 类型来获取数据?在您的应用程序中转发any 不是一个好主意。 Web API 层负责对获取的数据进行粗略的验证检查。如果它有效,你至少可以给它一个带有字符串索引签名、值类型或类似的通用对象类型。
  • @ford04 示例:我将从 REST API 获取数据,因为我不是 API 所有者,因此无法控制数据的形状。假设 API 会根据不同的请求参数响应不同的数据形状,我将根据 API 响应的内容将这些响应数据映射到我的自定义本地类型。在这种情况下,至少我需要先将响应数据转换为any,然后再将其转换为我的本地类型。
  • @mannok 如果您之后将其转换为本地类型,您仍然应该使用 unknown。负责检查实际形状的函数可以使未知更具体。

标签: typescript casting eslint typescript-eslint


【解决方案1】:

也许是这样的?

interface Article {
    items: []
}

function funcToGetOnlineDataV2<T>(url: string): Promise<T> {
    return fetch(url)
        .then((response: Response) => {
            return response.json();
        });
};

funcToGetOnlineDataV2<Article>('http://getsomedata.com').then((res: Article) => {
    console.log(res);
});

【讨论】:

  • 这可以部分解决问题,但您假设您事先知道响应数据的形状。如果响应数据具有动态形状怎么办?
【解决方案2】:

据我所知,你不能这样做。

但是,any 和 unknown 是 TypeScript 中的顶级类型,因此只需使用 unknown 代替。所有可以赋值给any的值也可以赋值给unknown。

看来你的选择是:

  1. 禁用该行的 linting 规则,或者;
  2. 请改用unknown。

试图想出一些技巧来诱使 linter 认为 any 没有被使用不是一个好主意。

【讨论】:

  • 但是,unknown的属性不能分配给已知类型,这是一个很大的限制。
  • 只是想在这里补充一点,对于您的用例,unknown 实际上是正确的用法,因为您实际上不知道 API 调用会返回什么.使用 unknown 类型的方法是您可以检查其中是否存在属性,例如if (isExpectedType(unknownVar)) { workWith(unknownVar); } 看下一条评论中的小提琴
【解决方案3】:

为什么不直接抑制这样的警告:


  // tslint:disable-next-line: no-any
    const funcToGetOnlineData: (url: string) => any = () => {
    // const httpData = (some processes to retrieve http request data)
    // return httpData;
   };

【讨论】:

  • 那会让打字稿哭泣
猜你喜欢
  • 2020-02-16
  • 2021-11-09
  • 2020-03-11
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多