并发(个人收集)

6.泛型-函数

2020-02-17  本文已影响0人  我只会吃饭

泛型:

  1. 软件工程中,我们不仅要创建一致定义良好的API,同时也要考虑复用性,
  2. 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时可以提供十分灵活的功能
  3. 泛型就是解决 类 接口 方法的复用性和对不确定数据类型的支持(当然如果说不确定可以使用any类型,那相当于放弃了类型的检测)

大白话:就是预先定义的类型是固定的,而泛型帮我们解决的就是它可以让约定类型变成动态的,使用的时候再去定义,显然泛型可以让我们的代码可复用性更高

泛型定义

let arr:Array<number> = []; 
// 等价于 let arr:number[] = [];

一. 泛型函数

泛型可以支持不特定的数据类型,要求传入的参数和返回值是一致的

 function returnData<T>(val:T):T {
    return val;
 }

console.log(returnData('a')); // 默认 传入啥,泛型检测就是啥 =>  function returnData<"a">(val: "a"): "a"
console.log(returnData<number>(1)); // 检测传入类型是number类型 => function returnData<number>(val: number): number
// console.log(returnData<boolean>(1)); // 报错: 检测传入类型是boolean类型,但输入的是number => function returnData<boolean>(val: boolean): boolean


// 2. 对比2.1如果使用any作为value的类型及返回类型,则相当于放弃类型的检测
function createArray(length: number, value: any): Array<any> {
    let result = [];
    for (let i = 0; i < length; i++) {
        result[i] = value;
    }
    return result;
}

createArray(2, 'A'); // ['A', 'A']; 

// 2.1 那我们就可以使用泛型来定义函数的标准,在用的时候定义好类型,灵活且复用性高
function createArray<T>(length: number, value: T): Array<T> {
    let result: T[] = [];
    for (let i = 0; i < length; i++) {
        result[i] = value;
    }
    return result;
}

createArray<string>(2, 'A'); // ['A', 'A'];

1. 当泛型不指定类型

函数调用不指定类型的时候,编译并不会报错,那我们createArray后面的<T>就只相当于一个占位符,但当你初始化这个函数后,那么ts会启动类型推论,也就是说,初始化以后,返回值的类型就被固定了,当你赋值其他类型的值时,会发生编译错误

function createArray<TYPE>(length: number, value: TYPE): Array<TYPE> {
    let result: TYPE[] = [];
    for (let i = 0; i < length; i++) {
        result[i] = value;
    }
    return result;
}

createArray(2, 'A'); // ['A', 'A'];

2. 泛型多个参数类型约定

这段代码肯定会触发类型推论,因为moreType在调用时没有传类型,如果传类型,那肯定是按照类型来约束,其次,可以看到我们传递了一个array作为参数进去,接受参数的形参是result,result作为形参,类型约束时用了一个中括号包括起来了,它相当于对数组中每一个元素的类型约定,下标是一一对应的,也就是说,实参和形参一一对应,而约定返回值的类型放在了一个中括号中,这表示返回值是一个array,类型和返回值一一对应

function moreType<N, S>(result: [N, S]): [S, N] {
    return [result[1], result[0]];
}
moreType([1, 'A']); // ['A', 1]

上一篇下一篇

猜你喜欢

热点阅读