已定义但从未使用过泛型推断错误

问题描述 投票:0回答:1

直观看来这里不应该有任何错误:

type Penultimate<T extends any[]> = T extends [
  ...infer Init,
  infer Result,
  infer Last,
]
  ? Result
  : never;

export type { Penultimate };

但是 Typescript 会生成

错误 TS6133:声明了“Init”,但从未读取其值。

错误 TS6133:声明了“Last”,但从未读取其值。

我应该 // @ts-ignore 它还是我可以在这里做更正确的事情?

typescript
1个回答
1
投票

在 TypeScript 中,错误 TS6133 表示已声明变量但从未在代码中的任何位置读取或使用。虽然 TypeScript 编译器认识到

Init
Last
并未直接在代码中使用,但它们对于您为推断
Penultimate
类型而执行的元组操作至关重要。

使用

// @ts-ignore
可以抑制错误,但如果可能的话,通常最好更直接地解决问题,以维护更干净、更易于维护的代码。对于您的情况,您可以重构代码以满足 TypeScript 的未使用变量检查,而无需更改类型的行为。

由于您没有使用

Init
Last
但需要声明它们以实现所需的类型提取,解决错误的一种方法是在变量前添加下划线 (
_
)。这是 TypeScript 和许多其他编程语言中的常见约定,用于指示有意未使用变量:

type Penultimate<T extends any[]> = T extends [
  ...infer _Init,
  infer Penultimate,
  infer _Last,
]
  ? Penultimate
  : never;

export type { Penultimate };

此更改将告诉 TypeScript 编译器这些变量是有意未使用的,并且不应发出有关它们的错误。这种方法通常比使用

// @ts-ignore
更好,因为它保持意图清晰并且不会抑制其他潜在错误。

使用下划线前缀是一种简单而有效的解决方案,可以让您和其他开发人员知道元组的这些部分对于类型计算是必需的,但不会进一步使用。这样,您就可以保持代码的清晰度和目的,而无需在这些行上全局抑制编译器检查。

© www.soinside.com 2019 - 2024. All rights reserved.