From 31a3352deefd0f4448d1ec02d8fd0a48b4389180 Mon Sep 17 00:00:00 2001 From: David Furey Date: Wed, 10 Feb 2021 22:09:17 +0000 Subject: [PATCH] Reorder visitType check to fix bug --- src/transform-inline/visitor-type-check.ts | 6 ++--- test/issue-88.ts | 26 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 test/issue-88.ts diff --git a/src/transform-inline/visitor-type-check.ts b/src/transform-inline/visitor-type-check.ts index ec22f39..c674976 100644 --- a/src/transform-inline/visitor-type-check.ts +++ b/src/transform-inline/visitor-type-check.ts @@ -694,9 +694,7 @@ function visitIndexedAccessType(type: ts.IndexedAccessType, visitorContext: Visi } export function visitType(type: ts.Type, visitorContext: VisitorContext): string { - if (type.aliasTypeArguments && visitorContext.previousTypeReference !== type && (type as ts.TypeReference).target) { - return visitTypeAliasReference(type as ts.TypeReference, visitorContext); - } else if ((ts.TypeFlags.Any & type.flags) !== 0) { + if ((ts.TypeFlags.Any & type.flags) !== 0) { // Any return visitAny(visitorContext); } else if ((ts.TypeFlags.Unknown & type.flags) !== 0) { @@ -729,6 +727,8 @@ export function visitType(type: ts.Type, visitorContext: VisitorContext): string } else if (tsutils.isTypeReference(type) && visitorContext.previousTypeReference !== type) { // Type references. return visitTypeReference(type, visitorContext); + } else if (type.aliasTypeArguments && visitorContext.previousTypeReference !== type && (type as ts.TypeReference).target) { + return visitTypeAliasReference(type as ts.TypeReference, visitorContext); } else if ((ts.TypeFlags.TypeParameter & type.flags) !== 0) { // Type parameter return visitTypeParameter(type, visitorContext); diff --git a/test/issue-88.ts b/test/issue-88.ts new file mode 100644 index 0000000..7edba75 --- /dev/null +++ b/test/issue-88.ts @@ -0,0 +1,26 @@ +import * as assert from 'assert'; +import { is } from '../index'; + +/* https://github.com/woutervh-/typescript-is/issues/88 */ + +interface Z { + field: T; +} + +type Y = Z + +type X = Y + +describe('is', () => { + describe('Parameterised type alias of a parameterised type alias of an interface', () => { + it('should return true for object with field type string', () => { + assert.deepStrictEqual(is({ field: 'some-string' }), true); + }); + it('should return false for object with field type number', () => { + assert.deepStrictEqual(is({ field: 0 }), false); + }); + it('should return false for object without field', () => { + assert.deepStrictEqual(is({}), false); + }); + }); +});