用于检查函数参数可分配性的自定义 TSLint 规则(无双方差)

Custom TSLint rule to check function parameter assignability (no bivariance)

我只是偶然发现 TypeScript 对函数的可分配性检查不是很严格:https://www.typescriptlang.org/docs/handbook/type-compatibility.html#function-parameter-bivariance

不幸的是,对于某些模式,参数双方差错过了重要的类型检查。所以我想知道是否有可能建立一个自定义的 TSLint 规则来告诉我何时做这样的事情:

interface Base {}
interface BaseEx extends Base { x; }

let fn1: (a: Base) => void;
let fn2: (b: BaseEx) => void;

fn1 = fn2; // TSLint: parameter (a: BaseEx) is not assignable to (b: Base)

但是,关于创建自定义 TSLint 规则的文档似乎相当不完整,我只找到了一个纯语法检查的示例。如果你能给我一个资源来学习如何使用像这样的语义规则扩展 TSLint,我会很高兴。

在寻求实施自定义规则时,TSLint 源代码是有用的指导资源。 TSLint repo 中提供了所有内置规则的源代码。大多数规则不需要访问类型信息。但是,有两个可以:

这些规则使用 ProgramAwareRuleWalker, which makes type information available to the rule via the TypeChecker

有一些关于如何在 TypeScript Compiler API documenation 中使用 TypeChecker 的信息。

如果启用使用 ProgramAwareRuleWalker 的规则,则 TSLint 必须 运行 带有 --type-check 选项,并且还必须指定 --project