我有一个功能
uniqueIds(first: any[], second: any[]): number[] {
let prop = first[0] instanceof Owner ? "OwnerId"
: "BankId";
return _.unique(
_.map(
first,
o => o[prop]
)
.concat(
_.map(
second,
o => o[prop]
)
)
).filter(o => o);
}
银行或所有者是我希望此功能采用的可能类型,仅此而已。银行和所有者不共享接口或继承链
根据传入的类型,我想根据函数内第一行中看到的属性来索引对象。
我看上去很丑,有没有办法
uniqueIds<T> where T Bank | Owner
之类的东西,而无需诉诸
我目前在做什么?
答案 0 :(得分:1)
您可以声明:
function uniqueIds<T extends Owner[] | Bank[]>(first: T, second: T) { ... }
,但是您将无法向TypeScript证明o[prop]
是一个数字,并且会出现noImplicitAny
错误。假设您在每个呼叫站点都知道要传递所有者还是银行,那么最好传递属性名称,例如:
function uniqueIds<K extends string, T extends {[P in K]: number}>(
prop: K, first: T[], second: T[]): number[] {
return _.unique(
_.map(
first,
o => o[prop]
)
.concat(
_.map(
second,
o => o[prop]
)
)
).filter(o => o);
}