搜索词
- "区分编译器API中的隐式any和显式any。"
建议
在使用编译器API时,我注意到类型检查器无法区分 any
是由作者的决定还是编译器的默认情况产生的。
在内部分支中,我通过向 ts.TypeFlags
添加一个新字段和一个新的内置类型 any
来修复这个问题,并添加了标志。如果这个建议被接受,我很乐意将我的实现上传到上游。
用例
function hello(a, b) {}
function world(a: any, b: any) {
const c = b;
}
在当前版本的TypeScript中,这两个方法具有相同的参数,仅凭签名无法区分它们。向编译器添加显式的 any
可以使工具区分这些方法。
我发现这种修改在利用类型检查器分析编译器输出的工具中特别有用。例如,我内部一直在使用它来计算TypeScript代码的显式类型覆盖率,否则这是无法实现的。
示例
if (ts.isIdentifier(node)) {
const type = this.checker.getTypeAtLocation(node);
if (type.getFlags() & ts.TypeFlags.Any &&
!(type.getFlags() & ts.TypeFlags.Explicit)) {
this._untypedIdentifiers += 1;
} else {
this._typedIdentifiers += 1;
}
}
有了编译器的更改,现在可以从类型覆盖率计算中排除显式的 any。
检查清单
我的建议满足以下准则:
- 这不会对现有的TypeScript / JavaScript代码造成破坏性的变化
- 这不会改变现有JavaScript代码的运行时行为
- 这可以在不根据表达式的类型发出不同的JS的情况下实现
- 这不是一个运行时特性(例如新的表达式级语法)
1条答案
按热度按时间pu3pd22g1#
我非常希望这个能被添加进来。