Typescript -> знать, если данный интерфейс в псевдониме типа - PullRequest
0 голосов
/ 09 января 2019

У меня есть псевдоним типа на нескольких интерфейсах:

export interface A {}
export interface B {}
export interface C {}
export type Reference = A | B | C;

У меня есть метод с именем getReference, который возвращает по умолчанию массив Reference. Я хотел бы, чтобы мой метод взял универсальный тип и проверил, находится ли данный тип в моем псевдониме типа.

Что у меня есть:

export const getReference = (slug: ReferencesSlugs): (state: object) => Array<Reference> => {
   ....... // some code
   // return Reference[]
}

Что я хочу:

Dev может передавать универсальный тип и проверку Typescript, если данный тип находится в псевдониме типа (Ссылка).

export const getReference = <T>(slug: ReferencesSlugs): (state: object) => Array<T> => {
    ....... // some code
    // As T is in Reference type -> return T[]
}



this.store.pipe( select(getReference<A>('onchonch')) ); // VALID, tslint is ok
this.store.pipe( select(getReference<E>('onchonch')) ); // INAVLID, E is not in my type alias.

Спасибо заранее:)

1 Ответ

0 голосов
/ 09 января 2019

Предполагая, что ваши члены объединения (объединение в псевдониме типа) не так просты, как в вашем вопросе (т. Е. У них есть несколько членов), вы можете использовать ограничение типа для параметра универсального типа:

export interface A { a: number; }
export interface B { b: number; }
export interface C { c: number; }
export interface E { e: number; }
export type Reference = A | B | C;

export const getReference = <T extends Reference>(slug: ReferencesSlugs): (state: object) => Array<T> => {
    return null!;
}

getReference<A>('onchonch'); // VALID, tslint is ok
getReference<E>('onchonch'); // INAVLID, E is not in my type alias.

Причина, по которой члены имеют значение, заключается в том, что машинописный текст использует структурную совместимость для определения совместимости типов. Это означает, что если два типа имеют одинаковые поля, они будут совместимы. Это также означает, что два пустых интерфейса совместимы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...