Skip to content

Instantly share code, notes, and snippets.

@RubaXa
Last active July 16, 2019 15:23
Show Gist options
  • Save RubaXa/a2302c04f43f91f418dbe35c764360d6 to your computer and use it in GitHub Desktop.
Save RubaXa/a2302c04f43f91f418dbe35c764360d6 to your computer and use it in GitHub Desktop.
Cast & Meta types
// Думаю тут нет нужды в объяснениях:
export type Cast<X, Y> = X extends Y ? X : Y;
// А вот для `Meta`, нам понадобиться символ, ибо его «можно» ⤵️ (см. ниже)
export const __meta__ = Symbol('__meta__');
// «Можно» использовать для описания свойства объекта:
export type Meta<T> = {
[__meta__]?: T; // так же можно использовать и литералы, но символ пизже!
// т.е. его нельзя будет увидеть через autocomplete 👀
}
// А этот тип нужен чтобы получить связанные мета-данные:
export type GetMeta<
T extends {[__meta__]?: any} // тут мы опять ссылаемся на символ
> = {
// Хоть тут я и проверяю тип на абстрактный символ, но так
// в дженерике уже заявлен нужный, то и тут отработает всё верно
[K in keyof T]-?: K extends symbol ? T[K] : never;
}[keyof T]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment