微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通用函数参数限制为 T 的一个属性

如何解决通用函数参数限制为 T 的一个属性

我定义了一个 uniqBy 函数

export function uniqBy<T>(a: T[],key: any): T[] {
    const seen = {};
    return a.filter(function (item) {
        if (item) {
            const k = key(item);
            return seen.hasOwnProperty(k) ? false : (seen[k] = true);
        } else {
            return false;
        }
    });
}

这会根据输入数组强类型我的返回值,但我也希望 key 参数是强类型的,这样如果我尝试传入一个没有存在于 T。 当前使用情况示例:

uniqArray = uniqBy(this._checkups,x => x.CatDescription);

_checkups 是以下数组:

export interface Checkup {
  id: string;
  CatDescription: string;
  Processtitle: string;
  MsgProcessID: number;
  MsgDate: string;
  MsgStatus: number;
  MsgText: string;
  MsgAction: string;
  MsgEntityID: string;
  MsgEntity: string;
}

如果尝试执行以下操作,我会喜欢它:

uniqArray = uniqBy(this._checkups,x => x.NonExistantProperty);

给了我一个编译时错误(以及属性完成时的智能感知)。我将如何在参数中定义 key 以执行此操作?

这将返回一个只有唯一值 CatDescription 的项目数组(在重复的情况下取第一个带有 CatDescription 的对象)。

我不知道这叫什么,它不是用于过滤并返回布尔值的 Predicate<T>

解决方法

似乎是您传递回调的第二个参数,但您没有它的类型,因此您只需给它一个类型 (val: T) => T[keyof T]

export function uniqBy<T>(a: T[],key: (val: T) => T[keyof T]): T[] {
    const seen = {};
    return a.filter(function (item) {
        if (item) {
            const k = key(item);
            return seen.hasOwnProperty(k) ? false : (seen[k] = true);
        } else {
            return false;
        }
    });
}

然后通过添加不存在的键,它会给你一个错误

uniqArray = uniqBy<Checkup>(this._checkups,x => x.NonExistantProperty);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。