Open SebastienGllmt opened 2 years ago
Currently typescript-is fails with Failed to transform node when trying to index type using a generic type
Failed to transform node
This happens on latest master (0.19.0)
Both of these tests will fail
export const Status = { enable: 'enable', disable: 'disable' } as const; type StatusObject<Key extends 'enable' | 'disable'> = { status: (typeof Status)[Key]; }; describe('is', () => { describe('Accessing generic member of a type', () => { it('should return true for the right member', () => { assert.deepStrictEqual(is<StatusObject<'enable'>>({ status: Status.enable }), true); }); it('should return false for the wrong member', () => { assert.deepStrictEqual(is<StatusObject<'enable'>>({ status: Status.disable }), false); }); }); });
Currently, the code will throw on https://github.com/woutervh-/typescript-is/blob/0dbefd0d7f7e455ecd018673868b7bf7785c1296/src/transform-inline/visitor-utils.ts#L78 because the type of the node is TypeParameter which doesn't match either case.
TypeParameter
It looks like the cause of this issue is that TypeParameter contains both a valueDeclaration AND a type member
valueDeclaration
type
SymbolObject { ... valueDeclaration: NodeObject { ... }, type: TypeObject { ... }, target: SymbolObject { ... } }
In fact, it looks like this case affects any usage of typeof. For example, the following code works just fine:
typeof
type Foo = { foo: 0 }; is<Foo>('foo'); // false
However, this fails
const obj = { foo: 0 }; is<typeof obj>('foo'); // throws an exception
I think the fix is as simple as switching the priority of the condition here: check type first and THEN check valueDeclaration. This passes all existing tests and also fixes the two typeof issues I mentioned above.
Possible #59 #97 #103
Description
Currently typescript-is fails with
Failed to transform node
when trying to index type using a generic typeThis happens on latest master (0.19.0)
Issue reproduction
Both of these tests will fail
Investigation
Specific issue in this case
Currently, the code will throw on https://github.com/woutervh-/typescript-is/blob/0dbefd0d7f7e455ecd018673868b7bf7785c1296/src/transform-inline/visitor-utils.ts#L78 because the type of the node is
TypeParameter
which doesn't match either case.It looks like the cause of this issue is that
TypeParameter
contains both avalueDeclaration
AND atype
memberGeneral case
In fact, it looks like this case affects any usage of
typeof
. For example, the following code works just fine:However, this fails
Suggested fix
I think the fix is as simple as switching the priority of the condition here: check
type
first and THEN checkvalueDeclaration
. This passes all existing tests and also fixes the twotypeof
issues I mentioned above.Related issues
Possible #59 #97 #103