Typescript通用类型参数限制为联合类型

时间:2018-08-03 14:21:31

标签: typescript typescript-generics

我有一个功能

 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之类的东西,而无需诉诸 我目前在做什么?

1 个答案:

答案 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);
}