18.泛型约束

张开发
2026/4/3 21:05:41 15 分钟阅读
18.泛型约束
// 1. 泛型约束// 在类型后面跟一个extends 在跟一个约束的类型functionaddTextendsnumber(a:T,b:T){returnab}add(1,2)// 我们期望泛型的变量上面获取其length参数但是有的数据类型是没有length属性的interfaceLen{length:number}// function fnT extends Len(a: T) {// return a.length// }// fn(123)// fn([1, 2, 3])// fn(122333) // 报错// fn(false) // 报错// function getLegnthT extends Len(arg: T) {// return arg.length// }// console.log(getLegnthstring(123))// 2. 使用keyof 约束对象constobj{name:zhangsan,age:18}type keykeyoftypeofobj// name | age联合类型// 定义了T类型继承object类型的子类型// 使用keyof操作符获取T类型的所有键// 利用extends关键字约束 K类型必须为keyof T联合类型的子类型functionobTextendsobject,KextendskeyofT(obj:T,key:K){returnobj[key]}ob(obj,name)ob(obj,age)// ob(obj, sex) // 报错interfaceData{name:stringage:numbersex:string}// for in for(let key in obj)type OptionsTextendsobject{// 遍历T类型的所有键// 并将每个键的值设置为可选类型[keyinkeyofT]?:T[key]// readonly [key in keyof T]: T[key]}typeBOptionsData// type B {// name?: string;// age?: number;// sex?: string;// }// type B {// readonly name: string;// readonly age: number;// readonly sex: string;// }// 泛型类// 声明方法跟函数类似名称后面定义类型// class SubT {// attr: T[] []// add(a: T): T[] {// return [a]// }// }// let s new Subnumber()// s.attr [1, 2, 3]// s.add(123)// let str new Substring()// str.attr [1, 2, 3]// str.add(123)// console.log(attr, s.attr)

更多文章