1.索引类型
let obj = { a : 1 , b : 2 , c : 3 , }; function getKey(obj : any , keys : string[]){ return keys.map((key)=>obj[key]); } //指定所包含的属性 console.log(getKey(obj,["a" , "b"])); //放入不包含的属性,正常情况我们希望这种要报错 console.log(getKey(obj,["c","f"]));1.2 接下来学习几种方法概念
// keyof T interface Obj { a : number ; b : number ; }; let key : keyof Obj;// 自动转换成 let key: "a" | "b" // 索引访问操作符合 T[K] let value : Obj["a"];//自动转换成 let value: number // T extends U // 类型的继承1.3 学完上面几种方法概念后,我们将上面的函数进行改造,如果传入的字符串不包含所属属性,那么将报错
function _getKey<T , K extends keyof T>(obj : T , keys : K[]) : T[K][]{ return keys.map((key : K)=>obj[key]); }1.4 分析 从左往右看,T是约束obj的, K继承了 T的联合类型,所以此时K是联合类型, T[K][],联合类型的返回值数组
let _obj = { a : 1, b : 2, c : '3' } _getKey(_obj , ["a" , "b"]); // _getKey(_obj , ["c" , "E"]);//报错