1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
=== tests/cases/compiler/substitutionTypeNoMergeOfAssignableType.ts ===
interface Entry {
comment?: string;
>comment : string
}
interface Entity {
fields: {[key: string]: Entry};
>fields : { [key: string]: Entry; }
>key : string
}
type Fields<E extends Entity> = {
>Fields : Fields<E>
[P in keyof E["fields"]]: E["fields"][P]
};
type Nodes<T = any> = {
>Nodes : Nodes<T>
[P in keyof T]: T[P] extends Entity
? Fields<T[P]>
: T[P]
};
function makeEntityStore<T extends Record<string, Entity>>(config: T): Nodes<T> {
>makeEntityStore : <T extends Record<string, Entity>>(config: T) => Nodes<T>
>config : T
return {} as Nodes<T>
>{} as Nodes<T> : Nodes<T>
>{} : {}
}
const myTest = makeEntityStore({ test: { fields: { id: {} } } });
>myTest : Nodes<{ test: { fields: { id: {}; }; }; }>
>makeEntityStore({ test: { fields: { id: {} } } }) : Nodes<{ test: { fields: { id: {}; }; }; }>
>makeEntityStore : <T extends Record<string, Entity>>(config: T) => Nodes<T>
>{ test: { fields: { id: {} } } } : { test: { fields: { id: {}; }; }; }
>test : { fields: { id: {}; }; }
>{ fields: { id: {} } } : { fields: { id: {}; }; }
>fields : { id: {}; }
>{ id: {} } : { id: {}; }
>id : {}
>{} : {}
myTest.test
>myTest.test : Fields<{ fields: { id: {}; }; }>
>myTest : Nodes<{ test: { fields: { id: {}; }; }; }>
>test : Fields<{ fields: { id: {}; }; }>
|