Typescript基础4--泛型

作者: Dabao123 | 来源:发表于2017-08-24 21:23 被阅读38次
泛型

我们有时候会碰到一种情况,对于一个函数我们不清楚参数的类型,也不清楚返回值的类型一般情况我们会使用any

function dabao (arg : any) : any{
    return arg; 
}

但是使用any却丢失了一些信息:传入的类型与返回的类型应该是相同的。 如果我们传入一个数字,我们只知道任何类型的值都有可能被返回。因此,我们需要一种方法使返回值的类型与传入参数的类型是相同的。
所以,我们需要一个类型变量。

function dabao<T> (arg : T) : T {
    return arg;
}

我们定义了一个变量T,T会帮助我们捕获传入的类型,之后就会使用该类型。比如

dabao('string')

T会捕获类型为string类型

使用泛型变量

如果我们需要传入一个数组,数组类型待定,得到数组长度

Paste_Image.png

现在假设我们想操作T类型的数组而不直接是T。由于我们操作的是数组,所以.length属性是应该存在的。 我们可以像创建其它数组一样创建这个数组:

function dabao<T> (arg : T[]) : T[] {
    console.log(arg.length)
    return arg;
}
泛型类型
function xiaobao<T>(arg:T) : T{
    return arg
}
let dabao : <T>(arg: T) => T = xiaobao;

console.log(dabao("string"))

我们还可以使用带有调用签名的对象字面量来定义泛型函数:

function xiaobao<T>(arg:T) : T{
    return arg
}
let dabao : {<T>(arg: T) : T} = xiaobao;
console.log(dabao("string"))

使用接口

interface fun {
    <T>(arg: T) : T
}
function xiaobao<T>(arg:T) : T{
    return arg
}
let dabao : fun = xiaobao;
console.log(dabao("string"))

我们可能想把泛型参数当作整个接口的一个参数。 这样我们就能清楚的知道使用的具体是哪个泛型类型.

interface fun<T> {
    (arg: T) : T
}
function xiaobao<T>(arg:T) : T{
    return arg
}
let dabao : fun<string> = xiaobao;
console.log(dabao("string"))
泛型类
class Dabao<T> {
    name : T
    setName ( n : T){
        this.name = T
    }
}
var dabao = new Dabao<string>;
dabao.setName('cxh')
泛型约束

们有时候想操作某类型的一组值,并且我们知道这组值具有什么样的属性。 在 第二个例子中,我们想访问arg的length属性,但是编译器并不能证明每种类型都有length属性,所以就报错了。


Paste_Image.png

相比于操作any所有类型,我们想要限制函数去处理任意带有.length属性的所有类型。 只要传入的类型有这个属性,我们就允许,就是说至少包含这一属性。 为此,我们需要列出对于T的约束要求

interface length {
    length : number
}

function dabao<T extends length>(arg:T) : T{
    console.log(arg.length)
    return arg
}

dabao('cxh');
dabao([1,2,3,4]);
dabao({name:123,age:234});

我们定义一个接口来描述约束条件。 创建一个包含 .length属性的接口,使用这个接口和extends关键字还实现约束,现在这个泛型函数被定义了约束,因此它不再是适用于任意类型,必须包含length属性

Paste_Image.png

在泛型里使用类类型

class Dabao{
   name : string = 'cxh'
}
class Xiaobao extends Dabao{
   age : number
}
class M {}
function create<T extends Dabao>(c: {new(): T; }): T {
   return new c();
}
console.log( create(Dabao).name )
console.log( create(Xiaobao).name )
console.log( create(M).name )

结果

Paste_Image.png Paste_Image.png

相关文章

网友评论

    本文标题:Typescript基础4--泛型

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