首页 > 解决方案 > Typescript -> 知道给定的接口是否在类型别名中

问题描述

我在多个接口上有一个类型别名:

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

我有一个调用的方法getReference,默认情况下返回一个引用数组。我希望我的方法采用泛型类型并检查给定类型是否在我的类型别名中。

我有 :

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.

提前感谢:)

标签: angulartypescriptngrx

解决方案


假设您的联合成员(类型别名中的联合)不像您的问题那样简单(即它们有一些成员),您可以对泛型类型参数使用类型约束:

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.

成员之所以重要,是因为 typescript 使用结构兼容性来确定类型兼容性。这意味着如果两种类型具有相同的字段,它们将是兼容的。这也意味着两个空接口是兼容的。


推荐阅读