title: typescript学习
tags: typescript学习
[toc]
泛型
基本使用
function loggingIdentity<T>(arg: Array<T>): Array<T> {
console.log(arg.length); // Array has a .length, so no more error
return arg;
}
第一个T提供了泛型参数(使用时候填写进去就好。就规定了这个函数的参数约束和返回值)
第二个T定义了参数的约束。为某种类型的数组。如果是直接为某种类型只要arg:T就好了。或者也可以用T[]来定义它为某种类型的数组。
第三个T定义了返回值的类型。
两种使用方法:
let output = identity<string>("myString");
-
let output = identity("myString");
(根据编译器自行判断)
泛型类
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; };
注意:静态属性不能使用泛型
泛型约束
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!
规定泛型输入的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)[]。
网友评论