** 温馨提示:学过java的会更好理解一些,TypeScriprt语法与java中的类思想相似,面向对象编程。
TS介绍:
1.什么是TS与JS的区别和联系是什么?
TS:JS的超集,即对JS的扩展,主要提供了类型系统和对 ES6+ 的支持,但TS最终会转换为js代码去执行。
特点:
- 始于 JavaScript,归于 JavaScript
- 强大的类型系统
- 先进的 JavaScript
区别:
TypeScript | JavaScript | |
---|---|---|
语言 | 面向对象编程语言 | 面向脚本编程 |
是否支持可选参数 | 支持 | 不支持 |
是否支持静态类型 | 支持 | 不支持 |
是否支持接口 | 支持 | 不支持 |
TS常用语法
定义变量的语法:let 变量名:变量类型
定于数组:
第一种,可以在元素类型后面接上[],表示由此类型元素组成的一个数组:
let list1: number[] = [1, 2, 3]
第二种方式是使用数组泛型,Array<元素类型>:
let list2: Array<number> = [1, 2, 3]
- 基础类型:
- boolean
- number
- String
- undefined和null(默认情况下 null 和 undefined 是所有类型的子类型)
- 数组
- 元组:表示一个已知元素数量和类型的数组,各元素的类型不必相同
- object:表示非原始类型,也就是除 number,string,boolean之外的类型
- 枚举:为一组数值赋予友好的名字
- any:不清楚类型的变量指定一个类型
- void
- 联合类型(Union Types)(表示取值可以为多种类型中的一种)
- 类型断言:可以用来手动指定一个值的类型。
语法:
方式一: <类型>值
方式二: 值 as 类型 tsx中只能用这种方式 - 类型推断:TS 会在没有明确的指定类型的时候推测出一个类型
有下面 2 种情况: 1. 定义变量时赋值了, 推断为对应的类型. 2. 定义变量时没有赋值, 推断为 any 类型
- 类
- 继承:类从基类中继承了属性和方法,通过extends实现
- 修饰符:public(默认)、private(不能在声明它的类的外部访问)、protected(子类可以访问)
- 存取器:TypeScript 支持通过 getters/setters 来截取对对象成员的访问。 它能帮助你有效的控制对对象成员的访问。
- 静态属性:
静态属性, 是类对象的属性
非静态属性, 是类的实例对象的属性 - 抽象类:不能被实例化,用abstract修饰
- 接口:(接口是对象的状态(属性)和行为(方法)的抽象(描述))
核心原则之一是对值所具有的结构进行类型检查
- 应用
/*
在 TypeScript 中,我们使用接口(Interfaces)来定义对象的类型
接口: 是对象的状态(属性)和行为(方法)的抽象(描述)
接口类型的对象
多了或者少了属性是不允许的
可选属性: ?
只读属性: readonly
*/
/*
需求: 创建人的对象, 需要对人的属性进行一定的约束
id是number类型, 必须有, 只读的
name是string类型, 必须有
age是number类型, 必须有
sex是string类型, 可以没有
*/
// 定义人的接口
interface IPerson {
readonly id: number
name: string
age: number
sex?: string
}
const person1: IPerson = {
id: 1,
name: 'tom',
age: 20,
sex: '男'
}
- readonly VS const
最简单判断该用 readonly 还是 const 的方法是看要把它做为变量使用还是做为一个属性。 做为变量使用的话用 const,若做为属性则使用 readonly。 - 类类型: 实现接口
一个类可以实现多个接口
一个接口可以继承多个接口 - 接口也可以相互继承
#函数类型
- 泛型:指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定具体类型的一种特性。
- 函数
- 可选参数和默认参数
function buildName(firstName: string = 'A', lastName?: string): string {
if (lastName) {
return firstName + '-' + lastName
} else {
return firstName
}
}
- 剩余参数
function info(x: string, ...args: string[]) {
console.log(x, args)
}
- 重载:
函数名相同, 而形参不同的多个函数 在 JS 中, 由于弱类型的特点和形参与实参可以不匹配, 是没有函数重载这一说的 但在 TS 中, 与其它面向对象的语言(如 Java)就存在此语法
常见面试题
- 什么是构造函数,其作用?
构造函数式一种特殊的方法,主要用于创建对象时初始化对象,即给对象成员属性赋值。和new关键字一起使用,而TS的构造函数通过关键字constructor实现,并用this关键字来访问当前类中的属性和方法。 - 为什么要用TS?
- TS在编译时就可以暴露问题,而JS则在运行时才可以发现
- TS作为一种强类型,明确知道数据类型,代码的可读性高,便于理解。
- 什么是泛型
在定义时不去指定类型,等使用时才去指定 - 什么是实例化?
一般创建一个类后并不能直接对属性和方法进行访问,必须对类进行实例化,需要创建一个对象。创建对象通过new关键字来实现,通过"."访问属性和方法。 - 什么是方法重写
子类可以直接继承父类的方法,直接使用,但有时子类并不想原封不动的继承父类中的方法,而是想做一定的修改,就是重写。重写的作用在于子类可以根据需要定义自己的特定行为,即子类能够根据需要实现父类方法。 - 什么是可索引类型接口
一般用来约束数组和对象 - never和void的区别
void表示没有任何类型,(可以赋值为null和undefined)
never表示不包含任何值,用永远没有值
拥有void返回值类型的函数可以正常运行,而never的则无法执行,也无法终止,会抛出异常。