泛型

泛型用于创建可重用组件,一个组件可以支持多种数据类型,使用时传入类型作为参数。TypeScript中使用泛型和Java基本一样。

泛型函数

function identity<T>(arg: T): T {
    return arg;
}
let output = identity<string>("myString");  // type of output will be 'string'

实际上,使用any也可以实现这种功能,但丢失了类型信息,不符合软件工程的思想,所以推荐尽量用泛型,在强类型语言中,any的作用仅仅是在不破坏代码可读性的前提下,替代一个很长却又显而易见的类型声明。

泛型函数类型

泛型函数类型和普通函数类型相同。只不过一些数据类型是用T表示。(不只是用T,其他字母也可以)

function identity<T>(arg: T): T {
    return arg;
}
let myIdentity: <T>(arg: T) => T = identity;

泛型接口和泛型类

interface GenericIdentityFn {
    <T>(arg: T): T;
}
interface GenericIdentityFn<T> {
    (arg: T): T;
}
class GenericNumber<T> {
    zeroValue: T;
    add: (x: T, y: T) => T;
}

如上述代码所示,和Java基本是一样的。

泛型的约束条件

假设这样一种情况,泛型可能是一个有length属性的对象,但定义泛型方法时,T没有length属性,TypeScript和Java的解决方式是完全相同的,添加泛型约束条件,使用T extends 一个接口即可。

interface Lengthwise {
    length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
    console.log(arg.length);  // Now we know it has a .length property, so no more error
    return arg;
}

注意:这样定义的泛型不再适用于任何类型,只适用于符合Lengthwise接口的类型。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap