我只是偶然发现TypeScript并不是非常严格地检查函数的可赋值性:https://www.typescriptlang.org/docs/handbook/type-compatibility.html#function-parameter-bivariance
不幸的是,对于某些模式参数,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,我会非常高兴。
答案 0 :(得分:4)
在寻求实现自定义规则时,TSLint源代码是一个有用的指导资源。 TSLint repo中提供了所有内置规则的来源。大多数规则不需要访问类型信息。但是,有两个做:
这些规则使用ProgramAwareRuleWalker
,通过TypeChecker
使规则可以使用类型信息。
有关TypeChecker
如何在TypeScript Compiler API documenation中使用的一些信息。
如果启用了使用ProgramAwareRuleWalker
的规则,则必须使用--type-check
选项运行TSLint,并且还必须指定--project
。