= { [key in keyof O]?: boolean };
Нужно поставить ограничение на ввод только одного ключа.
К примеру, есть объект const foobar = { foo: 'foo', bar: 2 }
Тогда
const x: MyType<typeof foobar> = { foo: true };
не должен позволять добавлять в себя ключ bar.
Т.е. следующий сценарий должен выдавать ошибку:
const x: MyType<typeof foobar> = { foo: true, bar: true };
Playground link
Заранее спасибо за ответ.
Где-то видел код преобразования юниона в тапл. Если считать этот тип за UnionToTuple, то можно через него: type OneKey<TBase, T extends TBase> = UnionToTuple<keyof T> extends [infer U] ? ({ [K in U]: boolean } & { [K in keyof TBase]?: never }) : never Но это выйдет использовать без явного указания типа только в функциях и мб потребует каст в теле функции: function x<T extends FooBar>(...[v]: [OneKey<FooBar, T>])
Можно типа вот так сделать: type EitherField<T, TKey extends keyof T = keyof T> = TKey extends keyof T ? { [P in TKey]-?:T[TKey] } & Partial<Record<Exclude<keyof T, TKey>, never>>: never const mo = { foo: 3, bar: 'ere' }; type MyObject<O> = EitherField<{ [key in keyof O]: boolean }>; const x: MyObject<typeof mo> = { foo: true, // Надо позволить только один из ключей bar: true // Вот тут ошибку надо };
Обсуждают сегодня