TypeScript彻底解读(26课时)_11.TypeScript彻底解读-类型推论和兼容性

11.TypeScript彻底解读-类型推论和兼容性

 

在一些时候省略指令,ts会帮咱们推断出省略的类型的地方适合的类型,经过学习ts的类型推论了解ts的推论规则windows

类型兼容性就是为了适应js灵活的特色,从而在一些状况下只要兼容的类型便可经过检测数组

建立文件并在index.ts中引入dom

类型推论

这里定义的name没有给他制定是什么类型的值,赋值一个字符串,ts就会给咱们推断出name多是想要一个字符串的类型函数

当咱们再给这个name赋值一个数值类型就会报错 了。学习

多类型联合

咱们不制定类型,ts会自动推断为联合类型对象

也就是这样,指定的状况blog

赋值为带布尔值的就不行了接口

都是经过等号右边的值,推断出左边的变量是什么类型的事件

上下文类型

根据等号左边去推断右边ip

js中的一些方法或者对象在ts中找不到,说明须要引入一些库

这里引入dom的库

这里绑定一个鼠标的点击事件

经过点.就能够把能访问的属性和方法都列出来

例如这里我访问一个.a由于是没有a这个属性的 就会报错。这里是由于已经推断出mouseEvent这个参数的类型。这就是根据左边的windows.onmousedown推断出了参数为鼠标的事件对象。这句是上下文类型

类型兼容性

定义一个接口Info,而后定义一个变量,infos类型是接口Info

而后再定义三个对象。 info1给infos赋值没有报错,是由于这个对象彻底符合接口的定义

info2赋值给infoInterface就报错了

info3赋值也没有报错,首先要求必须有name字段。info3是有的,可是info3多了一个age是没有问题的,必需要有name,多了无所谓

 

接口内再加一个info的属性是一个对象,里面包含age属性,这样下面的两个赋值都会报错了。

给info1加上info这个对象,可是是个空的对象,也是会报错。

这样加上再赋值就不会报错了,age的类型也必须是数字类型的

函数的兼容性

11分44秒

返回的都为10.x赋值给y是没问题的

y赋值给x就会报错

错误。类型参数个数的要求后面的函数的参数个数必须小于等于左边的函数的参数个数

遍历数组arrs,用foEach其实其余的两个参数是用不到的

不写后面两个参数的状况

forEach要求三个函数,可是实际上咱们只用到了一个参数,咱们我复制的函数的参数的个数 必定是小于被赋值的参数个数的

函数参数类型的要求

y赋值给x参数类型不一样就会报错

可选参数和剩余参数

这里其实是一个数组的求和的操做

打印出来求和的结果

 

不用可选参数,传入三个参数arg一、arg二、arg3三个参数,最终返回三个参数的和

函数参数双向协变

22分10秒

使用箭头函数,里面什么都不定义

funcB赋值给funcA是能够的

A赋值给B也是能够的,funcA的类型既能够是number也能够是stirng类型

返回值类型

定义返回值类型是string或者number联合类型

y赋值给x没有问题,y是stirng类型,x既能够是string类型,也能够是number类型

x赋值给y就会报错了

z赋值给y也是报错。由于他们的返回值类型是不兼容的

函数重载

必定要使用function关键字来定义

虽然个人函数体定义的是any类型,仍是会实际的检测出函数体的类型

传入两个number类型的数值,返回的就是number类型的

由于返回的是数字类型的,因此是没有lenth属性的,因此这里就会报错

 

他的类型实际上个接口,里面有两个函数重载

若是我这个是哦户给func赋sum函数就会报错,由于它缺乏一个函数重载的状况。merge赋值给func以后,经过类型推论就会推断出func有两个函数重载,要包括这两种状况

这里使用sum给func赋值的话,这个sum只包含一种函数重载,是缺乏一种状况的,因此之类就会报错,他俩是不兼容的。这个就是函数的兼容性

枚举

数字枚举类型和数字是互相兼容的

定义枚举类型StatusInterface

s是枚举类型StatusInterFace.On的值。

那么我给s赋值为1是能够的

赋值为2也是能够的。由于它是数字类型的。它是和数值类型是兼容的,只要给它赋的值数值类型就能够

给s赋值为另一个枚举的的值,虽然他们表示的都是0,可是这个地方是不兼容的。数字枚举类型只与数字类型兼容。在不一样枚举值之间是不兼容的

 

类的兼容性

定义三个类

再定义三个变量制定类型分别是这三个类。people赋值给animal是没有问题的

animal的类和people的类都有静态属性和构造函数,并animal的age类型是number类型。people的的age是string类型的

可是他们并不去监测类的静态成员和构造函数,它只会去比较实例上的成员,animal和people的实例都经过public name给实例上添加了name属性,并且类型都是stirng  ,因此这两个类,类型是兼容的,因此把people复制给animal是没有问题的

可是foodIsClass没有静态成员。,只有给实例上添加了一个name属性,可是它的name是number类型的,虽然也是name可是类型是不兼容的,因此food复制给animal就会失败。。这就是监测实例上的成员

private和protected

类的私有成员和受保护成员,这两个修饰符修饰的成员会对兼容性形成影响,当检查类的实例的兼容性时。  若是目标类型(要被赋值的那个值,就是建立这个实例的类的类。)若是这各种包含一个私有成员,那么原类型(用来赋值的值)必须包含来自同一个类的这个私有成员

ParentClass和OtherClass是如出一辙的,除了类名不同

子类是能够赋值给父类的类型的值的

指定类型是ParentClass,可是建立实例用的是OtherClass是不行的。

类型居右私有属性“”age“”的单独声明

都换成protected也是同样的道理

泛型的兼容性

泛型包含类型参数,能够是任意类型,使用时类型参数会被制定为一个特定的类型。而这个类型只影响使用类型参数的部分

data1里面只要用到类型的变量的地方都是number类型

data2里面只要用到类型变量的地方都是string类型

data2赋值给data1是能够的。明明传进去的类型不同,为何能够赋值呢?由于接口Data<T>{}括号内什么都没有。因此这里不论是传number仍是stirng都是没有影响的

能够理解为他俩能够是一个空对象

若是在接口里面定义实际的东西,定义data指定它的类型是T类型。如今赋值就不能够了,

由于data1里面要求它有一个data属性,类型是number

data2里面要求是stirng类型的

相关文章
相关标签/搜索