6.泛型-函数

作者: 我只会吃饭 | 来源:发表于2020-02-17 10:38 被阅读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]

相关文章

  • 6.泛型-函数

    泛型: 软件工程中,我们不仅要创建一致定义良好的API,同时也要考虑复用性,组件不仅能够支持当前的数据类型,同时也...

  • V语言学习笔记-14泛型

    目前的泛型主要有这三种:泛型结构体,泛型函数,泛型方法 泛型结构体 泛型函数 判断2个数组是否相等的泛型函数 泛型方法

  • swift泛型整理

    swift泛型知识主要包括:泛型函数、泛型协议、泛型类型、泛型约束。 一、泛型函数。 如:一个交换两个变量值的函数...

  • Swift 泛型

    泛型函数 泛型类型 泛型约束

  • ts 泛型

    函数泛型 接口,类泛型

  • Dart匿名函数+泛型

    匿名函数使用 无参数的匿名函数 带参数的匿名函数 函数体只有一行时,简写 泛型的基本使用 泛型集合 泛型类 泛型方法

  • TS中的泛型和装饰器

    本文目录: 1.什么是泛型 2.使用泛型变量 3.泛型接口 4.泛型类 5.泛型约束 6.装饰器 1.什么是泛型 ...

  • Kotlin语言(六):泛型

    1、泛型类 2、泛型函数 3、泛型上限 4、泛型擦除 5、泛型投射 6、星号投射

  • Kotlin reified - 关键字

    reified关键字是用于Kotlin内联函数的,修饰内联函数的泛型,泛型被修饰后,在方法体里,能从泛型拿到泛型的...

  • Java 泛型

    一、泛型使用 1、泛型类 2、泛型函数 二、泛型限定符 1、泛型上限 泛型上限使用 extends 限制 多个限制...

网友评论

    本文标题:6.泛型-函数

    本文链接:https://www.haomeiwen.com/subject/tdvpxhtx.html