diff --git a/src/TSHelper.ts b/src/TSHelper.ts index 6a9dc5a32..0d8276aa9 100644 --- a/src/TSHelper.ts +++ b/src/TSHelper.ts @@ -167,12 +167,12 @@ export function isExplicitArrayType(type: ts.Type, checker: ts.TypeChecker, prog return type.types.some(t => isExplicitArrayType(t, checker, program)); } - if (isStandardLibraryType(type, "ReadonlyArray", program)) { - return true; + const flags = ts.NodeBuilderFlags.InTypeAlias | ts.NodeBuilderFlags.AllowEmptyTuple; + let typeNode = checker.typeToTypeNode(type, undefined, flags); + if (typeNode && ts.isTypeOperatorNode(typeNode) && typeNode.operator === ts.SyntaxKind.ReadonlyKeyword) { + typeNode = typeNode.type; } - const flags = ts.NodeBuilderFlags.InTypeAlias | ts.NodeBuilderFlags.AllowEmptyTuple; - const typeNode = checker.typeToTypeNode(type, undefined, flags); return typeNode !== undefined && (ts.isArrayTypeNode(typeNode) || ts.isTupleTypeNode(typeNode)); } diff --git a/test/unit/tuples.spec.ts b/test/unit/tuples.spec.ts index 0f6aa6a39..4f527f29f 100644 --- a/test/unit/tuples.spec.ts +++ b/test/unit/tuples.spec.ts @@ -31,6 +31,15 @@ test("Tuple access", () => { expect(result).toBe(5); }); +test("Readonly Tuple access", () => { + const result = util.transpileAndExecute( + `const tuple: readonly [number, number, number] = [3,5,1]; + return tuple[1];` + ); + + expect(result).toBe(5); +}); + test("Tuple union access", () => { const result = util.transpileAndExecute( `function makeTuple(): [number, number, number] | [string, string, string] { return [3,5,1]; }