Skip to content

Instantly share code, notes, and snippets.

@RubaXa
Last active December 20, 2019 10:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RubaXa/cdd9a83695bb589eb414bde21fa8e056 to your computer and use it in GitHub Desktop.
Save RubaXa/cdd9a83695bb589eb414bde21fa8e056 to your computer and use it in GitHub Desktop.
type ObjectFromTuple<T extends string[]> =
FlattenObject< // 5. Делаем объект плоским
ToIntersect< // 4. Union to Intersection
{ // 2. { [key]: { [value]: value } }
[K in keyof T]: T[K] extends string
? Record<T[K], T[K]> // 1. { [value]: value }
: never
}[number] // 3. { [key]: { [value]: value } } -> { [value]: value } & { [value]: value }
>
>
;
function createObjectFromTuple<T extends string[]>(...tuple: T) {
return tuple.reduce((obj, key) => {
obj[key] = key;
return obj;
}, {} as ObjectFromTuple<T>);
}
// Проверяем
const result = createObjectFromTuple('foo', 'bar', 'qux');
// typeof result:
// {
// foo: "foo";
// bar: "bar";
// qux: "qux";
// }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment