typescript - 如何制作一个泛型过滤器,返回泛型中传递的数组元素
问题描述
我有一个Parent
由ChildA
and扩展的接口ChildB
;
interface Parent {
sharedProp: string,
}
interface ChildA extends Parent {
onlyInA: string,
}
interface ChildB extends Parent {
onlyInB: number
}
我有一个包含联合数组类型的数组:
const entities: (ChildA|ChildB)[] = [
{
sharedProp: "this will be B",
onlyInA: "because Im a"
}, {
sharedProp: "this will be B",
onlyInB: 12345
}
]
我已经做了我想要的非通用函数:
const childrenWithCertainSharedProp = (sharedProp: string): ChildA[] => {
return entities
.filter(isChildA)
.filter(e => e.sharedProp === sharedProp);
}
我可以console.log(childrenWithCertainSharedProp('xxx'));
但正如你所看到的,我将返回值设置为ChildA[]
,并且我可以对 . 执行相同的操作ChildB[]
。
我想要类似以下的东西,但我无法做到:
const childrenWithCertainSharedProp = <T>(sharedProp: string): T[] => {
return entities
.filter(/* filter depending on T */)
.filter(e => e.sharedProp === sharedProp);
}
基本上我想要的是以某种方式一般地输入guard,以一种我确保如果我通过<ChildA>
我将确保它只会过滤ChildA
等等的方式。
解决方案
您还需要至少传递一个具有该类型的参数,因为在运行时打字稿将无法访问类型参数。
作为警告,这只会和你的 typeGuards 一样好。
const childrenWithCertainSharedProp = <T extends ChildA | ChildB>(arr: T[], sharedProp: string): T[] => {
return arr.filter(e => e.sharedProp === sharedProp);
}
console.log(childrenWithCertainSharedProp(entities.filter(isChildA), 'xxx')[0].onlyInA);
console.log(childrenWithCertainSharedProp(entities.filter(isChildB), 'xxx')[0].onlyInB);
推荐阅读
- javascript - Google Maps Places Javascript API
- c# - SQL:在数据库中获取玩家排名
- github - github api 是否可以查看加入特定组织的时间?
- oracle - 运行指向 Oracle 数据库的 Perl 脚本时出现错误“install_driver(Oracle) failed”
- reactjs - ns.GetCommandSrc 不是函数
- reactjs - React 状态由 setState .methods 单独更新
- amazon-web-services - Amazon Lambda / API Gateway / Amazon Lex - 错误:已处理
- vue.js - 将数据传递给在 vuejs 中处于停用模式的组件
- routing - 路由器链接中的角度嵌套项
- php - 如何在不提交的情况下进行表单验证 laravel