typescript


title: typescript学习
tags: typescript学习


[toc]

泛型


基本使用

function loggingIdentity(arg: Array): Array {
    console.log(arg.length);  // Array has a .length, so no more error
    return arg;
}
第一个T提供了泛型参数(使用时候填写进去就好。就规定了这个函数的参数约束和返回值)
第二个T定义了参数的约束。为某种类型的数组。如果是直接为某种类型只要arg:T就好了。或者也可以用T[]来定义它为某种类型的数组。
第三个T定义了返回值的类型。
两种使用方法:
  1. let output = identity("myString");
  2. let output = identity("myString");(根据编译器自行判断)

泛型类


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

let myGenericNumber = new GenericNumber();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };

注意:静态属性不能使用泛型

泛型约束

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(c: new () => A): A {
    return new c();
}

createInstance(Lion).keeper.nametag;  // typechecks!
createInstance(Bee).keeper.hasMask;   // typechecks!

规定泛型输入的T的要求

类型推论

let x = [0, 1, null]; 会得出x
这里有两种选择: number和null。 计算通用类型算法会考虑所有的候选类型,并给出一个兼容所有候选类型的类型。

let zoo = [new Rhino(), new Elephant(), new Snake()];
由于最终的通用类型取自候选类型,有些时候候选类型共享相同的通用类型,但是却没有一个类型能做为所有候选类型的类型
let zoo: Animal[] = [new Rhino(), new Elephant(), new Snake()];
这里,我们想让zoo被推断为Animal[]类型,但是这个数组里没有对象是Animal类型的,因此不能推断出这个结果。 为了更正,当候选类型不能使用的时候我们需要明确的指出类型:
如果没有找到最佳通用类型的话,类型推断的结果为联合数组类型,(Rhino | Elephant | Snake)[]。

你可能感兴趣的:(typescript)