转发node
项目实践仓库git
https://github.com/durban89/typescript_demo.git tag: 1.4.1
为了保证后面的学习演示须要安装下ts-node,这样后面的每一个操做都能直接运行看到输出的结果。github
npm install -D ts-node
后面本身在练习的时候能够这样使用typescript
npx ts-node 脚本路径
由于TypeScript是结构性的类型系统,类型参数只影响使用其作为类型一部分的结果类型。好比,npm
interface Generics<T> {} let g1: Generics<number> = <Generics<number>>{}; let g2: Generics<string> = <Generics<string>>{}; g1 = g2;
上面代码里,g1和g2是兼容的,由于它们的结构使用类型参数时并无什么不一样。 把这个例子改变一下,增长一个成员,就能看出是如何工做的了:学习
interface Generics<T> { data: T; } let g1: Generics<number> = <Generics<number>>{}; let g2: Generics<string> = <Generics<string>>{}; g1 = g2;
运行后会看到相似以下的输出spa
$ npx ts-node src/type_compatibility_3.ts ⨯ Unable to compile TypeScript: src/type_compatibility_3.ts(8,1): error TS2322: Type 'Generics<string>' is not assignable to type 'Generics<number>'. Type 'string' is not assignable to type 'number'.
在这里,泛型类型在使用时就比如不是一个泛型类型。对于没指定泛型类型的泛型参数时,会把全部泛型参数当成any比较。 而后用结果类型进行比较,以下例子。好比:code
let t1 = function<T>(x: T): T { // other ... } let t2 = function<U>(y: U): U { // other ... } t1 = t2
若是有个相似如上的代码实例,是可否执行成功的,由于这里(x: any): any == (y: any): anyblog
目前为止,咱们使用了兼容性,它在语言规范里没有定义。 在TypeScript里,有两种类型的兼容性:子类型与赋值。 它们的不一样点在于,赋值扩展了子类型兼容,容许给 any赋值或从any取值和容许数字赋值给枚举类型或枚举类型赋值给数字。ip
语言里的不一样地方分别使用了它们之中的机制。 实际上,类型兼容性是由赋值兼容性来控制的,即便在implements和extends语句也不例外。 更多信息,请参阅 [TypeScript语言规范]
本实例结束实践项目地址
https://github.com/durban89/typescript_demo.git tag: 1.4.2