Skip to content

Commit

Permalink
fix: readonly tuples were recognized as arrays
Browse files Browse the repository at this point in the history
Resolves #1534

Co-Authored-By: Vladimir Ivakin <7985223+Minhir@users.noreply.github.com>
  • Loading branch information
Gerrit0 and Minhir committed Mar 14, 2021
1 parent b908c09 commit 99c6a13
Show file tree
Hide file tree
Showing 3 changed files with 145 additions and 88 deletions.
12 changes: 10 additions & 2 deletions src/lib/converter/types.ts
Expand Up @@ -936,12 +936,13 @@ const typeOperatorConverter: TypeConverter<ts.TypeOperatorNode> = {
convertType(context, type, node) {
// readonly is only valid on array and tuple literal types.
if (node.operator === ts.SyntaxKind.ReadonlyKeyword) {
assert(isObjectType(type));
const resolved = resolveReference(type);
assert(isObjectType(resolved));
const args = context.checker
.getTypeArguments(type as ts.TypeReference)
.map((type) => convertType(context, type));
const inner =
type.objectFlags & ts.ObjectFlags.Tuple
resolved.objectFlags & ts.ObjectFlags.Tuple
? new TupleType(args)
: new ArrayType(args[0]);

Expand Down Expand Up @@ -1027,6 +1028,13 @@ function isObjectType(type: ts.Type): type is ts.ObjectType {
return typeof (type as any).objectFlags === "number";
}

function resolveReference(type: ts.Type) {
if (isObjectType(type) && type.objectFlags & ts.ObjectFlags.Reference) {
return (type as ts.TypeReference).target;
}
return type;
}

function kindToModifier(
kind:
| ts.SyntaxKind.PlusToken
Expand Down
2 changes: 2 additions & 0 deletions src/test/converter/function/function.ts
Expand Up @@ -207,3 +207,5 @@ export function boolOrUndef(x: number) {

export function merged() {}
merged.nsFn = function () {};

export function gh1534(rt: readonly [number, string]) {}

0 comments on commit 99c6a13

Please sign in to comment.