打字稿 3 和数组类型节点



我最近从typescript@2.9.x更新到typescript@3.0.3,现在我的转译器程序出现了错误。你可以在Github上找到源代码。

转译器使用带有ts.createProgram(...)program.getTypeChecker()的打字稿 API 来检查当前节点的实际类型。您可以在src/compiler/Compiler.ts中看到转译设置。

我的测试仍然有效,但数组类型测试停止工作。这是特拉维斯CI链接确实查看测试输出。

我的猜测是src/transpiler/Types.ts中的Types.isArray()函数返回错误的布尔值。在typescript@3之前,此函数接收语法类元素ts.SyntaxKind.ArrayTypets.SyntaxKind.TupleType。当我使用数组类型代码调试测试时,如下所示:

const testArray: number[] = [1,2,3,4]
const secondIndex: number = testArray[2];

Types.isArray()将接收一个语法为ts.SyntaxKind.TypeLiteral的节点。

Typescript 修改了元组类型元素以启用泛型。这是TypeLiteral吗?此重大更改可能会影响也可能不会影响我的代码。

如果还有其他问题,请问,我会尝试更新这篇文章。

感谢您的帮助!

我刚刚发现,可以通过变量的符号获取变量的类型。 测试变量时,必须在某处声明它。此声明上应该有一个类型,此类型可用于检测这是数组还是元组类型。

我重构了isArray(...)函数以反映变量声明类型。这是新功能:

public static isArray(node: ts.Node, typeChecker: ts.TypeChecker): boolean {
// get the node type
const type = typeChecker.getTypeAtLocation(node);
const nodeType = typeChecker.typeToTypeNode(type);
const symbol = typeChecker.getSymbolAtLocation(node);
let typeLiteralArrayTypes: ts.SyntaxKind[];
// at typescript >= 3 array types can be type literals
if (symbol && symbol.declarations && nodeType.kind === ts.SyntaxKind.TypeLiteral) {
typeLiteralArrayTypes = symbol.declarations.map(dec => {
return (dec as any).type.kind;
});
}
// make the test
return nodeType
// is an array literal
&& ts.isArrayLiteralExpression(node)
// is a typescript 3 type literal
|| (typeLiteralArrayTypes
&& typeLiteralArrayTypes.every(typeLiteral => typeLiteral === ts.SyntaxKind.ArrayType || typeLiteral === ts.SyntaxKind.TupleType)
)
// normal types (typescript < 3)
|| (nodeType.kind === ts.SyntaxKind.ArrayType || nodeType.kind === ts.SyntaxKind.TupleType);
}

我确信这不是解决方案,但此更改满足了我的测试用例。如果您有更好的解决方案,请分享!

最新更新