简介 TypeScript一门是静态弱类型语言,准确的来说,TypeScript 是JavaScript的一个超集,可以把TypeScript文件编译成JavaScript文件,适用于任何JavaScript项目。
在JavaScript中有以下几个特点:
没有类型约束,一个变量可能初始化的时候是字符串,一会又变成数字
由于隐式类型转换的存在,有的变量的类型很难在运行前就确定。
基于原型的面向对象编程,使得原型上的属性或方法可以在运行时被修改。
是 JavaScript 中的函数,可以赋值给变量,也可以当作参数或返回值
这些特点是一把双刃剑,使得语言本身灵活发展无所不能,又使得它代码质量参差不齐,维护成本高,运行时错误多。而TypeScript的出现,很大程度上弥补了JavaScript的缺点。
我们熟知的JavaScript是动态弱类型语言,而TypeScript是静态弱类型语言。那么这两种类型又有什么区别呢?
动态类型:
动态类型是指在程序在运行之后才会进行类型检查,而这种方式往往会导致运行错误。
1 2 3 4 let foo = 1 ;foo.split(' ' );
静态类型:
静态类型是指编译阶段就能确定每个变量的类型,这种语言的类型错误往往会导致语法错误。能够在代码编写阶段就能够发现错误
1 2 3 4 let foo = 1 ;foo.split(' ' );
强类型:
对变量的类型有严格的限制,不允许改变变量类型,除非进行强制类型转换。
弱类型:
没有过多的约束,变量可以被赋予不同的数据类型。
数据类型 ts在js的数据类型基础上,新增了几种数据类型,分别是 void、any、never、元组、枚举和高级类型
基础类型 1 2 let str : string | boolean = 'hello world // 声明str变量 为string类型或者boolean类型 str = 10 //此时编辑器会提示错误 不能将类型“10”分配给类型“string | boolean”
数组 1 2 3 let arr1 : number [] = [1 ,2 ,3 ]let arr2 : Array <number > = [1 ,2 ,3 ] let arr3 : Array <number | string > = [1 ,2 ,3 ,'4' ]
元组 元组是一种特殊的数组 它限定了数组的类型于个数
1 2 3 4 let tuple : [string , number ] = ['0' , 1 ] tuple.push(2 ) console .log(tuple[2 ])
函数 1 2 3 4 5 let add = (x : number , y : number ) => x + y let add = (x : number , y : number ) : number => x + y let compute : (x : number , y : number ) => number compute = (a, b ) => a + b
对象 1 2 let obj : {x : number , y : number } = {x :1 , y :2 } obj.x = 3
symbol 1 2 3 let s1 : symbol = Symbol () let s2 = Symbol () console .log(s1 === s2)
undefined, null 1 2 3 4 5 6 let un: undefined = undefined let nu: null = null let num :number = 1 num = null
void
any
never 1 2 3 let error = ()=> { throw new Error ('err' ) }
枚举类型 数字枚举 1 2 3 4 5 6 7 8 enum Role { Zero, One, Two = 4 , Three } console .log(Role.Zero) console .log(Role.Three)
字符串枚举 1 2 3 4 enum Message { Susscess = '成功了' Fail = '失败了' }
异构枚举 1 2 3 4 enum Role { Zero, Susscess = '成功了' }
枚举成员 1 2 3 4 5 6 7 8 9 enum E { a, b = E.a, c = 1 + 1 , d = Math .random(), e = 'abc' .length }
常量枚举 1 2 3 4 5 const enum Mouth { Jan, Feb, Mar }
接口 对象类型接口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 interface List { readonly id: number , name: string , age ? : number , [x:string ] : any } interface Result { data: List[] } function render (res: Result ) { res.data.forEach(val => { console .log(val.id, val.name); }) } let result = { data: [ { id : 1 , name : 'fish' , sex :'男' }, {id :2 , name :'张三' } ] } render(<Result>{ data: [ { id : 1 , name : 'fish' , sex :'男' }, {id :2 , name :'张三' } ] } )
函数类型接口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 let add : (x: number , y: number ) => number interface Add { (x: number , y : number ) : number } type Add = (x: number , y: number ) => number let add : Add = (a, b ) => a + b
混合类型接口 在混合类型接口中,既可以定义函数,又可以像对象一样 拥有属性和方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 interface Lib { (): void ; version: string ; doSomething(): void ; } function getLib ( ) { let lib: Lib = (() => {}) as Lib; lib.version = '1.0' lib.doSomething = () => {} return lib; } let lib1 = getLib();lib1.doSomething(); let lib2 = getLib();lib2();