TS与JS的区别
TS: 静态类型的编程语言,编译时可以发现错误, tsc xxx.ts运行(安装typescript包) 、ts-node xxx.ts运行(安装ts-node包)
JS:动态类型的编程语言,运行时可以发现错误,node xxx.js运行
联合类型
let arr:(number| string)[] =[1,2,'3']
类型别名
type CustomArray = (number | string)[]
let arr1:CustomArray = [1,2,'23']
可选参数/可选属性
?
function f(name?:string,age:number){
console.log(1)
}
let pesron:{name?:string;age:number} = {
age:12
}
类型别名与接口的区别
相同点:都可以给对象指定类型
不同点:
接口只能给对象定义类型
类型别名不仅可以给对象,实际上可以给任意类型定义别名
接口 vs. 类型别名
像我们提到的,类型别名可以像接口一样;然而,仍有一些细微差别。
其一,接口创建了一个新的名字,可以在其它任何地方使用。 类型别名并不创建新名字—比如,错误信息就不会使用别名。 在下面的示例代码里,在编译器中将鼠标悬停在 interfaced上,显示它返回的是 Interface,但悬停在 aliased上时,显示的却是对象字面量类型。
interface Interface {
num: number;
}
declare function aliased(arg: Alias): Alias;
declare function interfaced(arg: Interface): Interface;
另一个重要区别是类型别名不能被 extends和 implements(自己也不能 extends和 implements其它类型)。 因为 软件中的对象应该对于扩展是开放的,但是对于修改是封闭的,你应该尽量去使用接口代替类型别名。
另一方面,如果你无法通过接口来描述一个类型并且需要使用联合类型或元组类型,这时通常会使用类型别名。
出处
Typescript
接口继承
interface Point2D {
x:number;
y:number
}
interface Point3D extends Point2D {
z:number
}
元组
一种数组,当明确知道类型和数量时可以使用
let n :[number,string] =[2,'3']
类型断言
as关键字或者 <>
const alink = document.getElementById('a') as HTMLAnchorElement
const alink = <HTMLAnchorElement>document.getElementById('a')
字面量类型
抽象类
为什么叫抽象类?
很显然,抽象类是一个广泛和抽象的概念,不是一个实体,就比如上文的例子,动物这个概念是很广泛的,猫、狗、狮子都是动物,但动物却不好是一个实例,实例只能是猫、狗或者狮子。
官方一点的说法是,在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
比如 Animal 类只是具有动物都有的一些属性和方法,但不会具体到包含猫或者狗的属性和方法。
所以抽象类的用法是用来定义一个基类,声明共有属性和方法,拿去被继承。
抽象类的好处是可以抽离出事物的共性,有利于代码的复用。
抽象方法和多态
多态是面向对象的三大基本特征之一。
多态指的是,父类定义一个抽象方法,在多个子类中有不同的实现,运行的时候不同的子类就对应不同的操作,比如,
abstract class Animal {
constructor(name:string) {
this.name = name
}
public name: string
public abstract sayHi():void
}
class Dog extends Animal {
constructor(name:string) {
super(name)
}
public sayHi() {
console.log('wang')
}
}
class Cat extends Animal {
constructor(name:string) {
super(name)
}
public sayHi() {
console.log('miao')
}
}
Dog 类和 Cat 类都继承自 Animal 类,Dog 类和 Cat 类都不同的实现了 sayHi 这个方法。