打字稿->知道给定的接口是否在类型别名中

时间:2019-01-09 10:18:39

标签: angular typescript ngrx

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

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 :(得分:2)

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

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.

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