zoukankan      html  css  js  c++  java
  • TS 3.1

    原文地址 www.tslang.cn

    泛型之Hello World

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

    我们定义了泛型函数后,可以用两种方法使用。 第一种是,传入所有的参数,包含类型参数:

    let output = identity<string>("myString");  // type of output will be 'string'
    

    这里我们明确的指定了Tstring类型,并做为一个参数传给函数,使用了<>括起来而不是()

    第二种方法更普遍。利用了_类型推论_ -- 即编译器会根据传入的参数自动地帮助我们确定 T 的类型:

    let output = identity("myString");  // type of output will be 'string'
    

    泛型类型

    注释:泛型可以在接口、函数、类和别名中使用

    泛型函数的类型与非泛型函数的类型没什么不同,只是有一个类型参数在最前面,像函数声明一样:

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

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

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

    这引导我们去写第一个泛型接口了。 我们把上面例子里的对象字面量拿出来做为一个接口:

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

    这样接口里的其它成员也能知道这个参数的类型了。

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

    除了泛型接口,我们还可以创建泛型类。 注意,无法创建泛型枚举和泛型命名空间。

    泛型类

    泛型类看上去与泛型接口差不多。 泛型类使用( <>)括起泛型类型,跟在类名后面。

    class GenericNumber<T> {
        zeroValue: T;
        add: (x: T, y: T) => T;
    }
    
    let myGenericNumber = new GenericNumber<number>();
    myGenericNumber.zeroValue = 0;
    myGenericNumber.add = function(x, y) { return x + y; };
    

    我们在那节说过,类有两部分:静态部分和实例部分。 泛型类指的是实例部分的类型,所以类的静态属性不能使用这个泛型类型。

    泛型约束

    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;
    }
    

    在泛型约束中使用类型参数

    你可以声明一个类型参数,且它被另一个类型参数所约束。 比如,现在我们想要用属性名从对象里获取这个属性。 并且我们想要确保这个属性存在于对象 obj上,因此我们需要在这两个类型之间使用约束。

    注释:正文中例子有误,应该改为如下。
    注释:keyof 可以用于接口、类、泛型、数值、字符串、数组、元组、Object上

    function getProperty<T>(obj: T, key:keyof T) {
        return obj[key];
    }
    
    let x = { a: 1, b: 2, c: 3, d: 4 };
    
    getProperty(x, "a"); // okay
    getProperty(x, "m"); // error: Argument of type 'm' isn't assignable to 'a' | 'b' | 'c' | 'd'.
    

    在泛型里使用类类型

    注释:这里包含了使用完整函数类型方式声明构造函数的方法

    class BeeKeeper {
        hasMask: boolean;
    }
    
    class ZooKeeper {
        nametag: string;
    }
    
    class Animal {
        numLegs: number;
    }
    
    class Bee extends Animal {
        keeper: BeeKeeper;
    }
    
    class Lion extends Animal {
        keeper: ZooKeeper;
    }
    
    function createInstance<A extends Animal>(c: new () => A): A {
        return new c();
    }
    
    createInstance(Lion).keeper.nametag;  // typechecks!
    createInstance(Bee).keeper.hasMask;   // typechecks!
    

    ——————————————————————————————————————————————————

    注释:以下内容来源于 TS 3.1 - 类型兼容性

    泛型

    因为 TypeScript 是结构性的类型系统,类型参数只影响使用其做为类型一部分的结果类型。比如,

    interface Empty<T> {
    }
    let x: Empty<number>;
    let y: Empty<string>;
    
    x = y;  // OK, because y matches structure of x
    

    上面代码里,xy是兼容的,因为它们的结构使用类型参数时并没有什么不同。 把这个例子改变一下,增加一个成员,就能看出是如何工作的了:

    interface NotEmpty<T> {
        data: T;
    }
    let x: NotEmpty<number>;
    let y: NotEmpty<string>;
    
    x = y;  // Error, because x and y are not compatible
    

    在这里,泛型类型在使用时就好比不是一个泛型类型。

    对于没指定泛型类型的泛型参数时,会把所有泛型参数当成any比较。 然后用结果类型进行比较,就像上面第一个例子。

    比如,

    let identity = function<T>(x: T): T {
        // ...
    }
    
    let reverse = function<U>(y: U): U {
        // ...
    }
    
    identity = reverse;  // OK, because (x: any) => any matches (y: any) => any
    
  • 相关阅读:
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1057:简单计算器
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1061:求整数的和与均值
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1061:求整数的和与均值
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1061:求整数的和与均值
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1060:均值
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1060:均值
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1060:均值
    如何绕过Windows Server 2008 R2上的身份验证
    如何绕过Windows Server 2008 R2上的身份验证
    SQLServer中创建主键的方法
  • 原文地址:https://www.cnblogs.com/qq3279338858/p/14189999.html
Copyright © 2011-2022 走看看