TypeScript中如何定义接收未知形状对象数组的函数?
更优的TypeScript实现方案
直接用any确实不是最佳选择——它会完全丢失TypeScript的类型检查能力,没法利用类型系统带来的提示和错误预警。针对你这个复制任意对象数组的需求,泛型是更合适的方案,既能保留类型信息,又能支持任意形状的对象。
实现代码
const copyData = <T>(items: T[]): T[] => { const myData = items.slice(); return myData; };
为什么这更好?
- 泛型
T会自动推断传入数组的元素类型,比如你传入[{id: 1, name: "Tom"}, {id: 2, age: 30}],TypeScript会自动识别T为{id: number, name: string} | {id: number, age: number},返回的数组也会保持这个类型。 - 后续操作
myData或者返回值时,你能得到完整的类型提示,比如访问myData[0].id会被TS识别为number类型,要是写错属性名(比如写成idd)会直接报错,这是any做不到的。 - 完全兼容任意形状的对象数组,不需要为不同类型的对象写多个函数,复用性拉满。
额外提示
如果你的myData是函数外部的变量,也应该给它加上泛型类型声明,比如:
let myData: T[]; const copyData = <T>(items: T[]): void => { myData = items.slice(); };
不过更推荐把myData放在函数内部作为局部变量,避免全局变量带来的类型混乱。
内容的提问来源于stack exchange,提问作者TommyD
相关产品推荐
相关产品推荐

