我爱编程

TypeScript学习-Generics

2017-06-30  本文已影响116人  指尖泛出的繁华

软件工程主要部分就是构建不仅良好定义,通用的而且可复用APIs。


type variable

能确定传入参数的类型也能用也能用来表示返回的类型

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

上面的就叫做Generics,它允许我们在函数的一侧导入Type information,然后在另一侧输出这个Type information


泛型函数调用

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

泛型类型Generic Types

为了表示一下泛型函数的类型:

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

我们可以定义一下几种方式:

let myIdentity: <T>(arg: T) => T = identity;

T的命名方式随意,只要数量和和使用方式相同就

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

我们也可以创建Generic class,但是不能创建Generic enums 和 Generic namespaces


Generic Constraints

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;
}
function getProperty<T, K extends keyof T>(obj: T, key: K) {
    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'.
function create<T>(c: {new(): T; }): T {
    return new c();
}
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!
上一篇 下一篇

猜你喜欢

热点阅读