Skip to main content

ts基础

ts的作用,

设计思想,不会影响现有的js代码.

无论是浏览器环境,还是node环境,均无法直接识别ts代码,需要编译器将ts代码转化为js代码,方可运行,官方提供的编译器叫做tsc.

bash
1
2
npm install -g typescript

安装完成后,通过tsc -v命令来检查是否安装成功

bash
1
2
3
tsc -v
Version 5.9.3

默认情况下,遇到编译错误,编译器依旧会生成js代码,若希望一旦报错就停止编译,可使用--noEmitOnError参数

由于ts的编译参数较多,ts编译器允许将编译参数写在tsconfig.json配置文件中,只要当前目录存在该文件,tsc就会自动读取

基本规则

类型的声明一律为在标识符后添加冒号+类型的方式.函数添加类型约束.

ts规定,变量只有在赋值之后才能使用,否则就会报错.

可是在实际测试过程中,发现并不会报错,这是怎么回事呢?

ts
1
2
3
4
5
let a;
console.log(a);
export { };

这是因为ts对仅声明为赋值的变量采用宽松处理,变量a被推断为any类型,不违反strict规则.

除此之外,ts中还有哪些特殊规定呢?这个问题不能一概而论,这和ts的配置文件息息相关.

在配置文件中开启严格模式之后,相当于开启所有严格检查.

在ts中,冒号之后是类型,

关于ts中的类型,有显示类型,也有隐式类型,

类型推断

类型声明并不是必须的,如果没有,ts会自己推断类型.

隐式类型,是因为ts具有类型推断功能,根据变量的值推断其类型,这时变量只能是某一类型的

如何查看ts对变量的类型推断结果? ts中的类型仅存在于编译时,在运行时会被擦除. 使用typeof在运行时只能检查基本类型.

关于typeof的使用

  • 运行时
  • 检查基本类型

值与类型 类型只是值的一个元属性,

值的元数据系统是深入理解js语言的关键.

基本数据类型就是单纯的一个值,并不存在元属性,元属性是对象才有的东东,但js有自动装箱功能.

关于类型小写与大写的区别?

原生类型,都是小写的,

首字母大写的类型,是实例类型.

在js中string和String的区别?

string表示基础数据类型,

String表示装箱类型,string对应的String对象

一般优先使用string,除非有特殊用途.

基础类型

联合类型

泛型

元组,长度和类型

ts类型

  1. any any顾名思义,就是该类型的变量可以被赋予任意类型的值.

any类型的变量,ts会关闭对该变量的类型检查,只要句法正确,就不会报错.

在新项目开发中应该尽量避免使用any,这样就失去了使用typescript的意义.

ts中的类型声明是非必须的,若没有显示为变量指定类型,ts需类型推断类型,若无法推断出类型,就会认为该变量的类型是any

ts提供了一个编译选项--noImplicitAny,打开该选项,只要推断出any类型就会报错.

json
1
2
3
4
5
6
7
8
9
10
11
{
"compilerOptions": {
"strict": true,
// 额外的严格检查
"noUnusedLocals": true, // 未使用的局部变量报错
"noUnusedParameters": true, // 未使用的参数报错
"noImplicitReturns": true, // 函数隐式返回报错
"noImplicitAny": true, // 未指定any报错
}
}

在此有一个例外,如果使用let或var声明了一个变量,但未声明其类型且未进行初始化,直接使用,及时打开noImplicitAny选项依旧不会报错.

由于该原因,建议使用let或var声明变量时,如果不赋值,一定要显示声明类型,否则可能存在安全隐患.

该问题如何解决呢?tsconfig.json是否可以设置变量未赋值就报错呢?

json
1
2
3
4
5
6
{
"noUnusedLocals": true,//检查未使用局部变量
}

关于any类型的两个问题:

  1. ts会关闭对any类型的类型检查
  2. 由于any类型可以赋值给其他任意类型,所以可能会污染其他变量,从而导致安全隐患.

any类型被称为是ts的逃生舱,应该慎用--在确实需要时才使用,而不是懒惰的解决方案.

unknown类型

为了解决any类型污染其他变量的问题,ts3.0引入了unknown类型,可以视为严格版的any

与any相比,区别在哪? 1.unknown类型的变量,不能直接赋值除any和unknown外的其他类型变量. 2.不能直接调用unknown类型的属性和方法 3.能够进行的运算是有限的,只能进行比较运算符,typeof,instanceof,其他运算都会报错.

上面说到unknown类型不能直接调用属性和方法,哪该如何调用属性和方法呢?答案是只有经过类型缩小后可以使用.

ts
1
2
3
4
5
6
let obj: unknown;
obj = { "name": "Tom", age: 20 };
if (typeof obj === "object" && obj !== null && "name" in obj) {
console.log(obj.name);
}

类型检查,类型断言

使用obj instanceof Object时,ts会将unknown类型收窄为object类型

ts类型收窄规则.

ts收窄方式: 1.typeof类型收窄 2.instanceof类型收窄. 3.in操作符 4.等效性收窄 5.联合类型收窄

never类型

空类型的概念,即该类型为空,不包含任何值.

如果一个变量可能有多种类型,如联合类型,剩余的情况就属于never类型.

never类型的一个重要特点就是可以赋值给任意类型.

什么是顶层类型,什么是底层类型.