Skip to content

Instantly share code, notes, and snippets.

@RubaXa
Created December 20, 2019 10:30
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/f925dc837815695d33a8f7ae80339377 to your computer and use it in GitHub Desktop.
Save RubaXa/f925dc837815695d33a8f7ae80339377 to your computer and use it in GitHub Desktop.
type Primitive = string | number | boolean | null;
type Token<N extends string, V extends Primitive> = {
name: N;
value: V;
}
type TokensDict<T extends Token<any, any>[]> =
FlattenObject<
ToIntersect<
{
[K in keyof T]: T[K] extends Token<infer N, any>
? Record<N, T[K]> // INFER всему голова!
: never
}[number]
>
>
;
// Фабрика токенов
function createToken<
N extends string,
V extends Primitive
>(name: N, value: V): Token<N, V> {
return {name, value};
}
// Функция создание словаря токенов
function createTokensDict<T extends Token<any, any>[]>(...tokens: T): TokensDict<T> {
return tokens.reduce((composite, token) => {
composite[token.name] = token.value;
return composite;
}, {} as TokensDict<T>)
}
// Проверяем
const result = createTokensDict(
createToken('foo', '123'),
createToken('bar', true),
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment