Я хочу определить, какой тип значения разрешен внутри объекта, на основе определенного интерфейса / типа:
type StorageValuesSyncOptions = {
toDoOrNotToDo: boolean,
piecesOfEight: number,
poem: string,
};
type SyncOptions<Options extends StorageValuesSyncOptions = StorageValuesSyncOptions> = {
[key in keyof Options]: SyncOption<Options, Options[key]>;
};
type SyncOption<K, V> = {
id: keyof K,
value: V,
};
Пока я использую SyncOptions
, у меня есть гарантия, что 'SyncOption' в формате, указанном в StorageValuesSyncOptions
. Однако я хочу вывести sh из универсальных SyncOption, чтобы он был заблокирован таким образом. Я думаю, что мне нужно использовать дискриминационное объединение, и было бы неплохо использовать значение по умолчанию, поэтому мне не нужно было указывать родовые типы.
В качестве примера это работает, как и ожидалось:
const options: SyncOptions = {
toDoOrNotToDo: {
id: 'toDoOrNotToDo',
value: true, //3 will result in an error
},
piecesOfEight: {
id: 'piecesOfEight',
value: 7, //"string" will result in an error
},
poem: {
id: 'poem',
value: "You and me", // true will not work
},
};
Я хотел бы, чтобы это привело к ошибке:
const poem: SyncOption = {
id: 'poem',
value: true //"but a string" should be valid
},