typescript-泛型和泛型约束

泛型 <T>

有的时候,函数的参数类型不确定,但是参数类型要一致,或者参数类型和返回值类型要一致,可以使用泛型,
泛型格式- - -一对尖括号里面放类型,例如: <T>。里面的 关键字随意,U、K、V 等等都可以,一般常用 T ,代表类型(type)

使用的时候可以不用写传入的 泛型类型,可以根据第一个传入的值的类型,自动推导出 泛型类型,然后使用了后面相同的泛型的都会限制为该类型

示例代码:

// 数组重载
function test1(a:number, b:number):Array<number> {
    
    
  return [a, b]
}

function test2(a:string, b:string):Array<string> {
    
    
  return [a, b]
}

// 可以使用泛型,简写
function test3<T>(a:T, b:T):Array<T> {
    
    
  return [a, b]
}

function test4<T,K>(a:T, b:K):Array<T | K> {
    
    
  return [a, b]
}

console.log(test3(1, 2));
console.log(test3('1', '2'));
console.log(test3(true,false));

console.log(test4(true,1));

打印结果:

在这里插入图片描述

在这里插入图片描述

泛型约束:extends、keyof

有些时候需要给泛型添加类型约束,限制是某类型范围下的,不然可能报错该类型没有**操作(extends);
还有获取对象属性值的时候,可以约束键为要操作对象的键名(extends + keyof)

示例代码:

function add<T extends number>(a:T, b:T) {
    
    
  return a + b
}
console.log(add(1, 2));


interface len {
    
    
  length: number
}

function test<T extends len>(a:T) {
    
    
  return a.length
}

console.log(test('花花'));
console.log(test(['花花', '何叶']));


function fn<T extends object, K extends keyof T>(a:T, b:K) {
    
    
  return a[b]
}

let obj = {
    
    
  name: '史迪仔',
  age: 100
}
console.log(fn(obj, 'name'));


// 将属性设置为可选
interface Data {
    
    
  name: string,
  age: number,
  sex: string
}

type Options<T extends object> = {
    
    
  [Key in keyof T]?:T[Key]
}

type B = Options<Data>

在这里插入图片描述
打印结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39111074/article/details/132143375