Typescript 泛型函数参数限制为T的属性

Typescript 泛型函数参数限制为T的属性,typescript,generic-function,Typescript,Generic Function,我有一个定义如下的uniqBy函数: 导出函数uniqBy(a:T[],键:any):T[]{ const seen={}; 返回a.filter(函数(项){ 如果(项目){ 常数k=键(项目); 返回seen.hasOwnProperty(k)?false:(seen[k]=true); }否则{ 返回false; } }); } 这将基于输入数组强类型化我的返回值,但我也希望key参数是强类型的,这样,如果我试图传入t上不存在的属性,就会出现编译时错误。 当前使用的示例: uniqArr

我有一个定义如下的
uniqBy
函数:

导出函数uniqBy(a:T[],键:any):T[]{
const seen={};
返回a.filter(函数(项){
如果(项目){
常数k=键(项目);
返回seen.hasOwnProperty(k)?false:(seen[k]=true);
}否则{
返回false;
}
});
}
这将基于输入数组强类型化我的返回值,但我也希望
key
参数是强类型的,这样,如果我试图传入
t
上不存在的属性,就会出现编译时错误。 当前使用的示例:

uniqArray=uniqBy(此._检查,x=>x.CatDescription);
\u检查
是以下各项的数组:

导出接口检查{
id:字符串;
CatDescription:字符串;
ProcessTitle:字符串;
MsgProcessID:编号;
MsgDate:字符串;
MsgStatus:数字;
MsgText:字符串;
MsgAction:string;
MsgEntityID:字符串;
MsgEntity:字符串;
}
如果尝试执行以下操作,我希望:

uniqArray=uniqBy(this.\u检查,x=>x.NonExistantProperty);
给了我一个编译时错误(以及属性完成时的IntelliSense)。如何在参数中定义

这将返回一个仅具有唯一值
CatDescription
的项目数组(在重复的情况下,使用
CatDescription
获取第一个对象)


我不知道它叫什么,它不是一个
谓词,因为它用于过滤并返回一个布尔值。

看起来像是第二个参数,您传递回调,但您没有它的类型,所以您只需给它一个类型
(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;
        }
    });
}
导出函数uniqBy(a:T[],key:(val:T)=>T[keyof T]):T[]{
const seen={};
返回a.filter(函数(项){
如果(项目){
常数k=键(项目);
返回seen.hasOwnProperty(k)?false:(seen[k]=true);
}否则{
返回false;
}
});
}
然后,通过添加不存在的密钥,它将给您一个错误

uniqArray = uniqBy<Checkup>(this._checkups, x => x.NonExistantProperty);
uniqArray=uniqBy(this.\u检查,x=>x.NonExistantProperty);

您可能希望将
T[keyof T]
作为返回类型,而不是
keyof
@georg perfect,我正要说明我在有效属性上遇到了错误。