泛型
我们需要考虑可重用性。组件不仅能支持当前的数据类型,还能支持未来的数据类型,所以,设计出泛型的功能。
需要一种方法使返回值的类型和传入的参数类型是相同的。 使用了类型变量, 只用作表示类型。
泛型变量
创建泛型函数时,要求函数体必须正确使用通用类型。 必须把参数当成是任意或者所有类型。
function log(arg:T[]):T[]{
console.log(arg.length)
return arg;
}
接收类型参数T和参数arg,他是个元素类型是T的数组。并返回元素类型是T的数组。
如果我们传入数字数组,将返回一个数字数组。可以让我们把泛型变量T当成类型的一部分使用,而不是整个类型。
泛型类型
创建泛型接口.
泛型函数的类型和非泛型函数的类型没有什么不同。只是有一个类型参数在前面。像函数声明:
function identity<T>(arg:T):T{
return arg;
}
我们可以使用带有调用签名的对象字面量来定义泛型函数:
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;
我们不再描述泛型函数。把泛型类型函数签名做为泛型类型一部分。描述哪一部分属于泛型部分,理解合适把参数放在调用签名里和放在接口上是很有帮助的。
泛型类
泛型类看上去和接口差不多。
类型推论
当需要从几个表达式推断类型时候,会使用这些类型表达式得类型来推断一个最合适得通用类型。
let x = [0,1,null];
为了推断x的类型,我们必须考虑所有元素的类型,一共有两种number和null.
计算通用类型算法会考虑所有的候选类型。并给出一个兼容所有候选类型的类型。
由于最终的通用类型取自候选类型,有时候候选类型共享相同的通用类型,但却没有一个类型能为所有候选类型的类型。
类型兼容性
typeScript里类型兼容性是基于结构子类型的。结构类型是一种只使用成员来描述类型的方式。它正好和名义类型形成对比。
在使用基于名义类型的语言中
高级类型
交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型。 它包含了所有需要的所有类型的特征。
联合类型
联合类型和交叉类型很有关联,但是使用上不完全相同。
我们可以使用联合类型为padding的参数:
string | number。
联合类型表示一个值可以是几种类型之一.
如果一个值是联合类型,我们只能访问这个联合类型的所有类型里共有的成员。
interface Bird{
fly();
layEggs();
}
interface Fish{
swim();
layEggs();
}
function getSmallPet():Fish|Bird{
//…
}
let pet = getSmallPet();
pet.layEggs();
pet.swim();