泛型T keyof
// extends function A<T>(a:T,b:T) { // return a+b // 此时提示报错,因为不是任何类型都可以接受+,所以此时加号不安全 } // 通过泛型extends数字类型,number能够接收+,所以不会报错 function B<T extends number>(a:T,b:T) { return a+b } // interface泛型添加extends interface D { length: string } function C<T>(a:T) { // a.length // 此时length报错,因为不确定有length属性 } function E<T extends D>(a:T) { a.length } // keyof是取属性 const F = { name: 'ffff', age: 234 } type key = typeof F // key = { // name: string, // age: number // } type key1 = keyof typeof F // key1 = 'name' | 'age' function ob<T extends Object, K extends keyof T>(obj: T, b: K) { // K extends keyof T 代表 K的类型限制是T的属性名,所以obj[b]不会报错,如果不做限制则报错 return obj[b] } // 使用keyof做泛型工具 interface obj { name: string, age: number } // 做一个传入接口,自动把所有属性修改为 属性?:类型 // 这里用了for(let key in obj)语法,key代表遍历的值 type Options<T extends object> = { [Key in keyof T]?: T[Key] } type B = Options<obj> // B = { // name?: string | undefined, // age?: number | undefined // }