Typescript学习笔记——2021
数组 数组解构 let x: number ; let y: number ; let z: number ;let five_array = [0 ,1 ,2 ,3 ,4 ];[x,y,z] = five_array;
数组展开运算符 let two_array = [0 , 1 ];let five_array = [...two_array, 2 , 3 , 4 ];
数组遍历 let colors: string [] = ["red" , "green" , "blue" ];for (let i of colors) { console .log(i); }
对象 对象解构 let person = { name: "Semlinker" , gender: "Male" , }; let { name, gender } = person;
对象展开运算符 let person = { name: "Semlinker" , gender: "Male" , address: "Xiamen" , }; let personWithAge = { ...person, age : 33 };let { name, ...rest } = person;
接口 在面向对象语言中,接口是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类去实现。
TypeScript 中的接口是一个非常灵活的概念,除了可用于对类的一部分行为进行抽象 以外,也常用于对「对象的形状(Shape)」进行描述。
对象的形状 interface Person { name: string ; age: number ; } let semlinker: Person = { name: "semlinker" , age: 33 , };
可选 | 只读属性 interface Person { readonly name: string ; age?: number ; }
只读属性用于限制只能在对象刚刚创建的时候修改其值。此外 TypeScript 还提供了 ReadonlyArray<T>
类型,它与 Array<T>
相似,只是把所有可变方法去掉了,因此可以确保数组创建后再也不能被修改。
let a: number [] = [1 , 2 , 3 , 4 ];let ro: ReadonlyArray<number > = a;ro[0 ] = 12 ; ro.push(5 ); ro.length = 100 ; a = ro;
任意属性 有时候我们希望一个接口中除了包含必选和可选属性之外,还允许有其他的任意属性,这时我们可以使用 索引签名 的形式来满足上述要求。
interface Person { name: string ; age?: number ; [propName: string ]: any ; } const p1 = { name : "semlinker" };const p2 = { name : "lolo" , age : 5 };const p3 = { name : "kakuqo" , sex : 1 }
接口与类型别名的区别 Objects/Functions 接口和类型别名都可以用来描述对象的形状或函数签名:
接口
interface Point { x: number ; y: number ; } interface SetPoint { (x: number , y : number ): void ; }
类型别名
type Point = { x: number ; y: number ; }; type SetPoint = (x: number , y: number ) => void ;
Other Types 与接口类型不一样,类型别名可以用于一些其他类型,比如原始类型、联合类型和元组:
type Name = string ;type PartialPointX = { x : number ; };type PartialPointY = { y : number ; };type PartialPoint = PartialPointX | PartialPointY;type Data = [number , string ];
Extend 接口和类型别名都能够被扩展,但语法有所不同。此外,接口和类型别名不是互斥的。接口可以扩展类型别名,而反过来是不行的。
Interface extends interface
interface PartialPointX { x: number ; }interface Point extends PartialPointX { y: number ; }
Type alias extends type alias
type PartialPointX = { x : number ; };type Point = PartialPointX & { y : number ; };
Interface extends type alias
type PartialPointX = { x : number ; };interface Point extends PartialPointX { y: number ; }
Type alias extends interface
interface PartialPointX { x: number ; }type Point = PartialPointX & { y : number ; };
Implements 类可以以相同的方式实现接口或类型别名,但类不能实现使用类型别名定义的联合类型:
interface Point { x: number ; y: number ; } class SomePoint implements Point { x = 1 ; y = 2 ; } type Point2 = { x: number ; y: number ; }; class SomePoint2 implements Point2 { x = 1 ; y = 2 ; } type PartialPoint = { x : number ; } | { y : number ; };class SomePartialPoint implements PartialPoint { x = 1 ; y = 2 ; }
Declaration merging 与类型别名不同,接口可以定义多次,会被自动合并为单个接口。
interface Point { x: number ; }interface Point { y: number ; }const point: Point = { x : 1 , y : 2 };