angular - 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.
提前感谢:)
解决方案
假设您的联合成员(类型别名中的联合)不像您的问题那样简单(即它们有一些成员),您可以对泛型类型参数使用类型约束:
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 使用结构兼容性来确定类型兼容性。这意味着如果两种类型具有相同的字段,它们将是兼容的。这也意味着两个空接口是兼容的。
推荐阅读
- android-studio - 在 Android Studio 中找不到“Google Sceneform Tools (Beta)”插件
- bash - bash函数输出到电子邮件而不改变格式
- angular - Checkbox not working. Angular 2
- android - 令牌以及如何处理它们
- react-native - iOS模拟器上需要未知模块“11”错误
- youtube-api - Q: Youtube Data Api v3 - 如何增加配额
- angular - 无法在角度 5 中正常闪烁消息
- vb.net - VB.NET 查找图像的像素颜色
- sql - SQL - 如何在 where 子句条件中添加计数
- android - 使用服务时Android应用关闭时如何从服务器获取数据并显示在通知中