TypeScript如何声明泛型函数返回类型:给输入对象数组每一项新增id属性
你可以用 TypeScript 泛型 + 交叉类型实现需求,同时还可以增加类型约束避免入参对象本身携带id属性产生冲突。
实现代码
// 基础版:任意对象数组都可传入,返回追加id属性的数组 const pickIdAndDocs = <T extends object>(arr: T[]): (T & { id: number })[] => { return arr.map(doc => ({ id: 1, // 若id实际为其他类型,修改此处类型定义即可 ...doc })) } // 增强约束版:要求入参对象不能自带id属性,避免属性覆盖的潜在问题 const pickIdAndDocs = <T extends { id?: never }>(arr: T[]): (T & { id: number })[] => { return arr.map(doc => ({ id: 1, ...doc })) }
这里的&是 TypeScript 的交叉类型运算符,作用是合并两个类型的所有属性,刚好符合你需要「扩展入参类型追加id属性」的需求。
使用示例
用你给出的iUser类型测试:
interface iUser { name: string; } const users: iUser[] = [ {name: "John"}, {name: "Joe"} ]; // 返回值的类型会自动推导为 ({ id: number } & iUser)[] const usersWithId = pickIdAndDocs(users); // 可以正常访问id和name属性,TS不会抛出类型错误 console.log(usersWithId[0].id); console.log(usersWithId[0].name);
内容的提问来源于stack exchange,提问作者Gaurav Saluja
相关产品推荐
相关产品推荐

