TypeScript 泛型

TS里面有泛型让我很意外,这个比AS3确实要强大:

let myIdentity_change : <T>(arg:T)=>T=function(a){ return a };

console.log(`generic : ${myIdentity_change<string>("Hello World!!!")}`);

结果:

看看泛型接口

①:注意接口(GenericFun)后面没有<T>

interface GenericFun{
    <T>(arg : T):T;
}
function indentity<T>(arg:T):T{
    return arg;
}
let myIdentity : GenericFun = indentity;

console.log(`generic : ${myIdentity<string>("Hello World!!!")}`);

②:这里有一个缺陷

interface GenericFun_change<T>{
    <T>(arg : T):T;
}
function indentity_01<T>(arg:T):T{
    return arg;
}
let myIndentity_01 : GenericFun_change<string> = indentity_01;

console.log(`generic : ${myIndentity_01<number>(123)}`);

结果:

但是,看代码参数123下面有红色波浪报错提示.虽然这样写能够得到正确的结果.但是myIndentity_01定义的泛型类型string和调用的类型number根本就不一致,在TS中不能这么干,但是生成的Js确实运行后能得到正确的结果.

以下是生成的JS的(没有类型的限制) :

function indentity_01(arg) {
    return arg;
}
var myIndentity_01 = indentity_01;
console.log("generic : " + myIndentity_01(123));

泛型类:

class GenericHandler<T>{
    zeroValue : T;
    add : ( x : T , y : T ) => T;
}

let  myGenericHandler : GenericHandler<number> = new GenericHandler<number>();
myGenericHandler.zeroValue = 0;
myGenericHandler.add = ( x : number , y : number ) => { return x + y; };

myGenericHandler.zeroValue = 2;
console.log( `2+5 = ${ myGenericHandler.add(2,5) } ` );
console.log(`zeroValue Value : ${ myGenericHandler.zeroValue }`);

结果:

泛型约束

interface Lengthwise{
    length : number;
}
class GenericHandler<T extends Lengthwise>{
    zeroValue : T;
    add : ( x : T , y : T ) => number;
}

let  myGenericHandler : GenericHandler<number[]> = new GenericHandler<number[]>();
myGenericHandler.zeroValue = null;
myGenericHandler.add = ( x : number[] , y : number[] ) => {
    return x.length + y.length;
};

let arr : number[] = [1,2,3];
myGenericHandler.zeroValue = arr;
let arr_2 : number[] = [2,3];
console.log( `[1,2,3] + [2,3] all length = ${ myGenericHandler.add(arr,arr_2) }` );
console.log(`zeroValue Value : ${ myGenericHandler.zeroValue }`);

如果T要用length属性的话 , 可以用以上方式 ( extends interface )

结果:

补充泛型方法约束写法:

//方法的泛型约束1
function add_change_01< T extends Lengthwise>( x : T , y : T ):number{
    return x.length + y.length;
}
//方法的泛型约束2
let add_change_02 = <T extends Lengthwise>( x : T , y : T ) =>{ return x.length + y.length; };

console.log( `add_change_01 ${ add_change_01<number[]>( arr , arr_2) }` );
console.log( `add_change_02 ${ add_change_02<number[]>( arr , arr_2) }` );

结果:

在泛型里使用类类型(2中方法的实际效果是一样的):

function create<T>( c : { new() : T } ):T{
    return new c();
}

let create_change_01 = <T>( c : { new() : T } ) => { return new c(); };

在泛型方法类类型中加入泛型约束(一下4个方法的效果是一样的):

interface LegthWish{
    length : number;
}

function create_constraint< T extends LegthWish >( c : { new() : T }):T{
    return new c();
}

function create_constraint_01<T extends LegthWish>( c : new() => T ):T{
    return new c();
}

let create_constraint_change_02 : Function = < T extends LegthWish >( c : { new() : T } )=>{ return new c(); };
let create_constraint_change_03 : Function = < T extends LegthWish >( c : new()=>T)=>{ return new c(); };

扩展一下:::

interface LegthWish{
    length : number;
}

function create_constraint< T extends LegthWish >( c : { new() : T }):T{
    return new c();
}

function create_constraint_01<T extends LegthWish>( c : new() => T ):T{
    return new c();
}

let create_constraint_change_02 : Function = < T extends LegthWish >( c : { new() : T } )=>{ return new c(); };
let create_constraint_change_03 : Function = < T extends LegthWish >( c : new()=>T)=>{ return new c(); };

class Ai implements  LegthWish{
    public length : number;
    constructor(){
        this.length = 1;
    }
}

class Bi implements LegthWish{
    public length : number;
    constructor(){
        this.length = 2;
    }
}

enum Factory_Type{
    AI = 0,
    BI = 1
}

let create_factory:( type : Factory_Type )=>LegthWish=function( a ){
    let  legthClass : LegthWish = null;
    switch( a ){
        case Factory_Type.AI:
            //legthClass = new Ai();//还可以用以下的方法来写
            legthClass = create_constraint_01<LegthWish>(Ai);
            break;
        case Factory_Type.BI:
            //legthClass = new Bi();
            legthClass = create_constraint_01<LegthWish>(Bi);
            break;
    }
    return legthClass;
};

let _ai : LegthWish = create_factory( Factory_Type.AI );
console.log(`this is AI.length : ${_ai.length}`);

let _bi : LegthWish = create_factory( Factory_Type.BI );
console.log(`this is BI.length : ${_bi.length}`);

结果:

时间: 2024-10-18 08:49:29

TypeScript 泛型的相关文章

【第7篇】TypeScript泛型的案例代码详解

8.1最简单泛型例子 Ts代码 /** * 没有泛型,我们要么必须给身份功能的特定类型 */ function identity1(arg: number): number { return arg; } /** * 或者:我们可以描述使用"任意"类型的标识功能: */ function identity2(arg: any): any { return arg; } Js文件 /** * 没有泛型,我们要么必须给身份功能的特定类型 */ function identity1(arg)

TypeScript泛型

泛型的概念 指不预先确定的数据类型,具体的类型要在使用的时候才能确定.咋一听,是不是觉得JavaScript本身就是这样?这是由于理解有误.前面说“在使用的时候确定”,而非在程序执行的时候确定. 泛型函数 现在有个需求:一个被定义的函数原本输入字符串输出字符串,现在想让它同时支持输入输出字符串数组,如何实现? 1.通过函数重载 // 函数调用时依照声明的顺序进行匹配 function log(value: string): string; function log(value: string[]

TypeScript 第六讲 ———— TypeScript 泛型

前言: 泛型:软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性.组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵话的功能. 在像c和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据.这样 用户就可以以自己的数据类型来使用组件. 通俗理解,泛型就是解决类接口方法的复用性.以及对不特定数据类型的支持 下面这种就只能返回string类型的数据: function getData(value:stri

TypeScript——泛型

定义:不预先确定的数据类型,具体的类型在使用的时候才能确定 好处:1.函数和类可以支持多种类型,增加的程序的可扩展性           2.不必写多条函数重载,联合类型声明,增强代码的可读性           3.灵活控制类型之间的约束 这里可以 把泛型理解为代表类型的参数 泛型函数 // 泛型函数 function log<T>(value: T): T { return value } log<string[]>(['a','b']) // 根据约束的类型带入函数 log(

TypeScript最大的目的是让程序员更具创造性

TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准. TypeScript 由微软开发的自由和开源的编程语言. TypeScript 设计目标是开发大型应用,它可以编译成纯 JavaScript,编译出来的 JavaScript 可以运行在任何浏览器上. 以上为网上对 Typescript 的一些解释,那我们为什么要学 Typescript? 提到前端我们首先会想到 HTML,CSS,JavaScript 三大家族,我们掌握这三个就可以在前端界获得一

[web建站] 极客WEB大前端专家级开发工程师培训视频教程

极客WEB大前端专家级开发工程师培训视频教程  教程下载地址: http://www.fu83.cn/thread-355-1-1.html 课程目录:1.走进前端工程师的世界HTML51.HTML5与HTML4的区别2.HTML5新增的主体结构元素3.HTML5新增的的非主体结构元素 4.HTML5表单新增元素与属性5.HTML5表单新增元素与属性(续)6.HTML5改良的input元素的种类 7.HTML5增强的页面元素8.HTML5编辑API之Range对象(一)9.HTML5编辑API之

极客学院Web前端开发技术实战视频教程 初级入门+高级实战++专家课程+面试指导

===============课程目录=============== ├<初级中级>│  ├<1. HTML5开发前准备>│  │  ├1.HTML5开发前准备.mp4│  │  └2.开发前的准备-快捷键.mp4│  ├<10. React.js>│  │  ├React.js简介.txt│  │  ├<1.React 概述>│  │  │  ├React 开发环境搭建.mp4│  │  │  ├编写第一个 React 程序.mp4│  │  │  └什么

2020年前端面试复习必读文章【超百篇文章/赠复习导图】

前言 之前写过一篇 一年半经验如何准备阿里巴巴前端面试,给大家分享了一个面试复习导图,有很多朋友说希望能够针对每个 case 提供一个参考答案. 写答案就算了,一是「精力有限」,二是我觉得大家还是需要自己「理解总结会比较好」. 给大家整理了一下每个 case 一些还算不错的文章吧(还包括一些躺在我收藏夹里的好文章),大家可以自己看文章总结一下答案,这样也会理解更深刻. 「并不是所有文章都需要看」,希望是一个抛砖引玉的作用,大家也可以锻炼一下自己寻找有效资料的能力 ~ ( 文章排序不分前后,随机排

TypeScript入门-泛型

泛型 要创建一个可重用的组件,其中的数据类型就必须要兼容很多的类型,那么如何兼容呢,TypeScript提供了一个很好的方法:泛型 Hello World 要兼容多种数据格式,可能会有人想到any,即 function identify(arg: any): any{    return arg; } 使用any存在一个问题,有可能传入的值和返回的值不是同一种值,例如,传入数字,但是不确定返回的是什么值 要解决这个问题,我们需要引入类型变量-一种特殊的变量,只用于表示类型不表示值 functio