TypeScript简述 Created 2018-01-05 | Updated 2021-12-23
| Word count: 2.4k | Reading time: 9min | Post View:
TypeScript
TypeScript 是静态类型
静态类型是指编译阶段就能确定每个变量的类型 这种语言的类型错误往往会导致语法错误。TypeScript 在运行前需要先 为 JavaScript,而在编译阶段就会进行类型检查
强类型:语言层面限制函数的实参类型必须与形参类型相同
注 :强类型
中不予许随意的数据隐式类型装换,而弱类型
允许;
初始化 安装 1 2 3 4 5 yarn init --yes yarn add typescript --dev `这时node_modules/bin目录中会有tsc文件, 用来编译typescript文件`
配置 1 2 3 4 5 6 7 yarn tsc --init "sourceMap" : true , "outDir" : "dist" , "rootDir" : "src" ,
常用语法 1 2 3 4 5 6 yarn tsc test.ts(需要编译的ts文件) yarn tsc yarn tsc --locale zh-CN
作用域问题 因为ts的变量设计是面向全局的,所以相同文件目录下的ts文件变量名称相等会照成冲突解决办法
1 2 3 4 5 6 7 (function ( ) { const a = 123 })() export {}
基础数据类型 JS的八种内置类型
变量的类型由后面声明的类型决定
1 2 3 4 5 6 7 8 let str: string = "Shrimps" ;let num: number = 22 ;let bool: boolean = true ;let u: undefined = undefined ;let n: null = null ;let obj: object = {x : 1 ,y : 2 };let big: bigint = 100n ;let sym: symbol = Symbol ("hey" );
类型限制 对象 1 2 3 4 5 const foo: object = function ( ) {} const obj: { foo : number , bar :string } = { foo : 123 , bar : 'Hey' }
数组 1 2 3 4 5 6 7 8 9 10 11 12 `两种创建方式` const arr1: Array <string > = ['七' ,'里' ,'香' ]const arr2: number [] = [12 ,54 ,123 ,342 ,1 ]function sum (...args: number [] ) { return args.reduce( prev, current ) => prev * current, 0 ) } sum(2 ,33 ,12 ,41 ,91 )
元组 列表是可以修改的数据结构,而元组是固定长度,不能被修改元素值的数据结构。
1 2 3 4 5 6 7 8 9 10 11 const str: [number ,string ] = [22 ,'KOS' ]const [ age,name ] = strObject .entries({ foo :123 , bar :'sad' })
枚举 枚举enum是一种特殊的类(但枚举是类),使用枚举可以很方便的定义常量
1 2 3 4 5 6 enum PostStatus { Draft = 1 , Unpublished = 1 , Published = 2 }
这种通过等号的显式赋值称为 initializer
。如果枚举中某个成员的值使用显式方式赋值,但后续成员未显示赋值, TypeScript 会基于当前成员的值加 1 作为后续成员的值
这种方式编译后对应文件会显示编译代码
1 2 3 4 5 6 7 8 const enum PostStatus { Draft, Unpublished, Published = 8 , testStr, }
函数 1 2 3 4 5 6 7 8 9 function func1 (a: number ,b?: numebr = 10 ): string { return 'Who am i' } func1(100 ,33 )
任意 any可以接收任意类型参数
1 2 3 4 5 6 7 8 9 10 function stringify (value: any ) { return JSON .stringify(value) } stringify('string' ) stringify(true ) stringify(100 )
类型别名 使用 type 给类型取别名
1 2 3 4 5 6 type test = number let counts :test = 124 type tit = string | boolean let str :tit = 'hey' let str1 : tit = true
交叉类型 用 &
进行连接
1 2 3 4 5 6 7 interface Itest { key : string } type test = Itest & { value : string }let mytest: test = { key:'No.1' ,value:'苦瓜柠檬' }
隐式类型推断 1 2 3 4 5 6 7 8 9 10 let age = 18 age = 'string' let test test = false
类型断言 1 2 3 4 5 6 7 8 const num1 = res as number const num2 = <number >res
接口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 interface Post { title : string content : string } function printPost (post: Post ) { console .log(post.title); console .log(post.content); } printPost({ title : 'Hello World' , content : 'Welcome my faveion firend' })
接口成员 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 `可选成员与只读成员` interface Post { title : string subtitle?: srtring readonly summary: string } `动态成员` interface Cache { [prop: string ]: string } const cache: Cache = {}cache.foo = 'i am string' cache.bar = '我是字符串鸭'
类 基本使用
父类 称为(超类),子类 被称为(派生类)
派生类如果包含一个构造函数constructor,则必须在构造函数中调用 super() 方法 !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Person { name : string age : number constructor (name: string ,age: number ) { this .name = name this .age = age } } sayHi(msg: string ): void { console .log(`I am ${this .name} ,${msg} ` ); }
类的访问修饰符 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 class OneLine { public name: string ; private age: number ; protected gender: boolean ; constructor (name:string , age:number ) { this .name = name, this .age = age, this .gender = true } } const oneli = new OneLine("Shrimps" , 20 );console .log(oneli.name); console .log(oneli.age); console .log(oneli.gender); class TwoLine extends OneLine { constructor (name: string , age: number ) { super (name, age) console .log(this .age); console .log(this .gender); } }
1 2 3 4 5 6 7 8 9 10 11 provate constructor (... ) { ... } `只读属性 readonly ` class Test { readonly test: void protected readonly test: void }
类类型接口
使用接口可以强制一个类的定义必须包含某些内容
要使用接口,需要使用关键字implements
implements 关键字用来指定一个类要继承的接口,如果是接口和接口、类和类直接的继承,使用extends
,如果是类继承接口,则用implements
。
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 interface Eat { eat (food: string ): void } interface Run { run (run: string ): void } class Person implements Eat ,Run { eat (food: string ): void { console .log('人类的吃法' ); } run (run: string ): void { console .log('直立行走' ); } } class animal implements Eat ,Run { eat (eat: string ): void { console .log('动物的吃法' ); } run (run: string ): void { console .log('爬行' ); } }
抽象类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 abstract class Animals { eat (eat: string ): void { console .log('动物们的吃法' ); } abstract run (distance: number ): void } class Dog extends Animals { run (distance: number ): void { console .log('四脚爬行' , distance); } } const dogs = new Dog()dogs.eat('来福' ) dogs.run(999 )
泛型 泛型
就像一个占位符一个变量,在使用的时候我们可以将定义好的类型像参数一样传入,原封不动的输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 function createNumberArray (length: number , value: number ): number [] { const arr = Array <number >(length).fill(value) return arr } const res = createNumberArray(3 ,77 )function createArray <T > (length: number , value: T ): T [] { const arr = Array <number >(length).fill(value) return arr } const res = createArray<string >(3 ,'hey' )