Я пытаюсь получить доступ к свойству из сопоставленного типа, используя универсальный тип. Но я получаю сообщение об ошибке в комментарии ниже. Как правильно напечатать что-то подобное?
type ThingType = 'typeA' | 'typeB';
interface Thing<T extends ThingType> {
type: T,
name: string
};
type Container<T extends ThingType> = {
[id: string]: Thing<T>
}
type Store<T extends ThingType = ThingType> = {
[K in T]?: Container<K>
};
const myStore: Store = {
'typeA': {
'one': {type: 'typeA', name: 'one'},
'two': {type: 'typeA', name: 'two'}
}
};
// This one does not fail
const typeAContainer: Container<'typeA'> | undefined = myStore['typeA'];
function storeThing<T extends ThingType>(thing: Thing<T>) {
// Error here:
const container: Container<T> | undefined = myStore[thing.type];
// Type 'Store<ThingType>[T]' is not assignable to type 'Container<T> | undefined'.
// Type 'Container<"typeA"> | Container<"typeB"> | undefined' is not assignable to type 'Container<T> | undefined'.
// Type 'Container<"typeA">' is not assignable to type 'Container<T>'.
// Type '"typeA"' is not assignable to type 'T'.
// '"typeA"' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'ThingType'.
// Type 'Store<ThingType>[T]' is not assignable to type 'Container<T>'.
// Type 'Container<"typeA"> | Container<"typeB"> | undefined' is not assignable to type 'Container<T>'.
// Type 'undefined' is not assignable to type 'Container<T>'.
// ... code here ...
}
storeThing({type: 'typeA', name: 'three'});