如何解决通用函数参数限制为 T 的一个属性
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] 举报,一经查实,本站将立刻删除。