本节:自学的一些typescript的就基本语法。
ts的提示性更强,ts会检查代码 ,ts代码要tsc编译成js代码,才可以正常运行
一、函数的不同,1.function变成 => 2.全部的变量 ,数组都加了一个冒号和类型, 变量名:类型
prototype(允许您向对象添加属性和方法):对象.prototype.增加的属性 = "赋的值"
数组的不同:就是多了个数组名:类型[]
TypeScript 元组
我们知道数组中元素的数据类型都一般是相同的(any[] 类型的数组可以不同),如果存储的元素数据类型不同,则需要使用元组。
元组中允许存储不同类型的元素,元组可以作为参数传递给函数。
var mytuple = [10,"Runoob"]; // 创建元组
console.log(mytuple[0]) //10
console.log(mytuple[1]) //Runoob
-
数组名.push() 向元组添加元素,添加在最后面。
-
数组名.pop() 从元组中移除元素(最后一个),并返回移除的元素。
数组的赋值:ts可以直接 [赋值的对象] = 赋值的内容 ,而js要一个下标一个下标的赋值
| ,?,any
?就是这个变量可以有也可以没有,类型加?就是类型可以是任意类型
!!返回原来的数
&交叉类型,就是两种函数里面的参数 都可以使用
断言, |选择你要用的对象,指定你要的属性 as any
ts里面构造函数要提前声明变量,ts里面要用到的变量都必须提前声明变量
public全部都可以用,private私有可以用,protected继承它的子类可以用它的变量
static静态属性,就是不像其他变量要new成实例化对象,就可以直接调用属性,static还有静态函数的,一样直接调用方法就可以了。静态属性,只能用this访问别人的静态属性,别人也不能通过this访问静态函数,只可以用自己的 函数名.静态函数调用。静态函数可以互相调用。
implements关联另一个接口变量 ,通过接口约束那个类,调用那个类
constructor构造函数,abstract是抽象类,抽象类是不能被new实例化的
元组是固定数量,不同类型的数组。
字符才有length,数字没有length
通过enum定义 枚举,玫举默认就是012开始的值,增长玫举,就是可以改变第一个数,然后数组就会自己往下递增
readonly变量只读,不能改变
类型推论和类型别名
类型推论,就是你定义变量,但是不定义类型,ts就会根据你赋值的内容,来推论出你这个变量是什么类型的。
类型别名就是给每个类型,定义一个新的名字,这样你定义变量的时候,就可以直接用别名。
type s = string//把string类型,定义成s,后面要定义string类型,就直接用s就可以了
never表示状态不存在,出现never的时候,说明你赋值的逻辑可能有问题。函数里面, 永远不会有返回值的时候,就定义一个never类型。never只能作为父类型,不能作为子类型赋值,还有就是在switch里面做判断的时候的default,兜底类型,就是出错的时候,可以用never来定义类型
symbol类型是一个唯一值,symbol类型的值是symbol构造函数创建的,里面传对数字和字符串比较好,不能传对象。 symbol类型的属性要通过 object.getOwnPropertySymbols(变量)才可以被单独打印出symbol类型,reflect.ownKeys(变量)
symbol.iterator迭代器,迭代器函数,通过输出的done状态,看得,是否输出完了,为true说明输出完了 变量.next()输出迭代
变量名.set(),可以往map里面放内容。迭代器有什么用。
生成器 迭代器都只支持数组,不支持对象
for(let i of arr){} of是取值的,in是取下标的
泛型, 定义的时候不明确类型, 传参的时候,再定义类型,ts就会自动进行类型推断,防止代码冗余。可以少定义函数类型,可以用keyof来限制泛型对象。
泛型类,
如果直接在ts文件里面定义变量,则默认为全局的,除非前面加个export导出,就可以变量名重复,不同文件就互不干扰。
三斜线指令 ,可以导入其他文件
///<reference path="..." /> ///也等于import
declare声明文件,一些依赖或者模块是通过declare关键字来声明文件的,当然还可以直接下载依赖
Mixins混入,对象混入和类的混入
Object.assign(变量名1,变量名2)合并对象,输出的值,为交叉类型,就是什么类型都有
装饰器Decorator,增加代码的可读性,