6.泛型-函数
2020-02-17 本文已影响0人
我只会吃饭
泛型:
- 软件工程中,我们不仅要创建一致定义良好的API,同时也要考虑复用性,
- 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时可以提供十分灵活的功能
- 泛型就是解决 类 接口 方法的复用性和对不确定数据类型的支持(当然如果说不确定可以使用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]