Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 获取任何对象数组参数的泛型函数_Typescript - Fatal编程技术网

Typescript 获取任何对象数组参数的泛型函数

Typescript 获取任何对象数组参数的泛型函数,typescript,Typescript,我创建了2个通用函数,它们将接受任何对象的数组。第一个函数将属性作为字符串和字符串值,您希望与给定对象匹配。第二个函数将返回给定对象的最后一个id // First data const data = [ { id: 1, name: 'John', }, { id: 2, name: 'Doe', }, { id: 3, name: 'Tim', },

我创建了2个通用函数,它们将接受任何对象的数组。第一个函数将属性作为字符串和字符串值,您希望与给定对象匹配。第二个函数将返回给定对象的最后一个
id

// First data
const data = [
    {
        id: 1,
        name: 'John',
    },
    {
        id: 2,
        name: 'Doe',
    },
    {
        id: 3,
        name: 'Tim',
    },
];
// Second data
const data2 = [
    {
        id: 1,
        title: 'John',
    },
    {
        id: 2,
        title: 'Doe',
    },
    {
        id: 3,
        title: 'Tim',
    },
];


export const matchStr = <T>(key: string, val: string, data: Array<T>): string => {

    if (Array.isArray(data) && data.length > 0) {
        const result = data.find((obj) => {
            return obj[key] === val;
        });
        // If not undefined
        if (result) {
            return `${key} value is matched.`;
        } else {
            // Return value
            return val;
        }
    }
    return val;
};


export const getLastId = <T>(data: Array<T>): number => {
    if (Array.isArray(data) && data.length > 0) {
        // Create an array of Id's of all items
        const idsArray: number[] = [];
        data.forEach((obj) => {
            idsArray.push(obj.id);
        });
        // Return last element id
        return idsArray[data.length - 1];
    } else {
        return 1;
    }
};


const resultSet1 = matchStr('name', 'John', data);
const resultSet2 = matchStr('name', 'George', data2);

console.log(resultSet1);
console.log(resultSet2);

const resultId = getLastId(data);

console.log(resultId);
关于第二个函数:

idsrarray.push(obj.id)

有什么问题吗?
.

一切正常。您声明函数应该接受T类型,但TypeScript不知道这是什么T类型。当然,它不能期望这个t会有属性id

要解决此问题,您可以执行以下操作:

  • 创建接口:
接口IId{
id:编号;
}
  • 更改函数声明以指示typescript应使用id为的内容:
export const getLastId=(数据:数组):number=>{
if(Array.isArray(data)和&data.length>0){
//创建所有项目的Id数组
常量IDSRARY:编号[]=[];
data.forEach((obj)=>{
idsrarray.push(对象id);
});
//返回最后一个元素id
返回idsrarray[data.length-1];
}否则{
返回1;
}
};
现在一切都会好起来的

UPD:

根据TS版本错误,使用

返回obj[key]==val

仍然可能发生。要解决此问题,您至少有两个选项:

再声明一个接口:

接口索引器{
[键:字符串]:任意;
}
和重新声明功能:

export const matchStr=(key:string,val:string,data:Array):string=>{
或将obj投射到函数内部的任何对象

const result=data.find((obj:any)=>obj[key]==val;);
最后一个选项更简单,但它不是类型安全的,所以我不推荐它,因为代码应该是可维护的


希望这有帮助。

一切正常。您声明函数应接受类型T,但TypeScript不知道这是什么类型的T。当然,它不能期望此T具有属性id

要解决此问题,您可以执行以下操作:

  • 创建接口:
接口IId{
id:编号;
}
  • 更改函数声明以指示typescript应使用id为的内容:
export const getLastId=(数据:数组):number=>{
if(Array.isArray(data)和&data.length>0){
//创建所有项目的Id数组
常量IDSRARY:编号[]=[];
data.forEach((obj)=>{
idsrarray.push(对象id);
});
//返回最后一个元素id
返回idsrarray[data.length-1];
}否则{
返回1;
}
};
现在一切都会好起来的

UPD:

根据TS版本错误,使用

返回obj[key]==val

仍然可能发生。要解决此问题,您至少有两个选项:

再声明一个接口:

接口索引器{
[键:字符串]:任意;
}
和重新声明功能:

export const matchStr=(key:string,val:string,data:Array):string=>{
或将obj投射到函数内部的任何对象

const result=data.find((obj:any)=>obj[key]==val;);
最后一个选项更简单,但它不是类型安全的,所以我不推荐它,因为代码应该是可维护的


希望这有帮助。

谢谢你的回答,但是如何在第一个功能中解决问题。检查更新。我的tsc没有抱怨,所以我错过了那部分。添加了两个选项来解决你的问题。谢谢你的回答,但是如何在第一个功能中解决问题。检查更新。我的tsc没有抱怨,所以我错过了那部分。添加了two解决问题的选项。
TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'unknown'. No index signature with a parameter of type 'string' was found on type 'unknown'.
TS2339: Property 'id' does not exist on type 'T'.