Skip to content

Commit 1534fa2

Browse files
authored
Merge pull request #87 from davidfurey/issue-86-type-alias
Add functionality to capture type parameters in interfaces
2 parents 1ab21f4 + 179e6d5 commit 1534fa2

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

src/transform-inline/visitor-utils.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,19 @@ export function getTypeReferenceMapping(type: ts.TypeReference, visitorContext:
138138
if (tsutils.isInterfaceType(type.target)) {
139139
const baseTypes = visitorContext.checker.getBaseTypes(type.target);
140140
for (const baseType of baseTypes) {
141+
if (baseType.aliasTypeArguments && visitorContext.previousTypeReference !== baseType && (baseType as ts.TypeReference).target) {
142+
const typeReference = baseType as ts.TypeReference
143+
if (typeReference.aliasTypeArguments !== undefined && typeReference.target.aliasTypeArguments !== undefined) {
144+
const typeParameters = typeReference.target.aliasTypeArguments;
145+
const typeArguments = typeReference.aliasTypeArguments;
146+
for (let i = 0; i < typeParameters.length; i++) {
147+
if (typeParameters[i] !== typeArguments[i]) {
148+
mapping.set(typeParameters[i], typeArguments[i]);
149+
}
150+
}
151+
}
152+
}
153+
141154
if (tsutils.isTypeReference(baseType) && baseType.target.typeParameters !== undefined && baseType.typeArguments !== undefined) {
142155
const typeParameters = baseType.target.typeParameters;
143156
const typeArguments = baseType.typeArguments;

test/issue-86.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import * as assert from 'assert';
2+
import { is } from '../index';
3+
4+
/* https://github.com/woutervh-/typescript-is/issues/86 */
5+
6+
type Y<T> = {
7+
field: T;
8+
}
9+
10+
interface X extends Y<string> {
11+
}
12+
13+
describe('is', () => {
14+
describe('Interface extending a parameterised type alias', () => {
15+
it('should return true for object with field type string', () => {
16+
assert.deepStrictEqual(is<X>({ field: 'some-string' }), true);
17+
});
18+
it('should return false for object with field type number', () => {
19+
assert.deepStrictEqual(is<X>({ field: 0 }), false);
20+
});
21+
it('should return false for object without field', () => {
22+
assert.deepStrictEqual(is<X>({}), false);
23+
});
24+
});
25+
});

0 commit comments

Comments
 (0)