TypeScript | 青训营笔记

61 阅读4分钟

TypeScript | 青训营笔记

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

TypeScript 是由微软开发的一款开源的编程语言,TypeScript 是 Javascript 的超集,遵循最新的 ES6、ES5 规范,TypeScript 扩展了 JavaScript 的语法。TypeScript 更像后端 Java、C#这样的面向对象语言,可以让 JavaScript 开发大型企业项目。谷歌也在大力支持 Typescript 的推广,谷歌的 angular2.x+ 就是基于 Typescript 语法,最新的 Vue 、React 也可以集成 TypeScript。Nodejs 框架中的 Nestjs、midway 中用的就是 TypeScript 语法。

01 认识TypeScript

TS是一个静态类型、弱类型语言

静态类型:静态语言的数据类型是在编译期间(或运行之前)确定的,编写代码的时候要明确确定变量的数据类型

弱类型:某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过显性强制转换

静态类型

  • 可读性增强:基于语法解析TSDoc,ide增强
  • 可维护性增强:在编译阶段暴露大部分错误

多人合作的大型项目种,获得更好的稳定性和开发效率

JS的超集

  • 包含与兼容所有JS特性,支持共存
  • 支持渐进式引入与升级

02 基础语法

基础数据类型

/* 字符串 */
const q: string = 'string';
/* 数字 */
const w: number = 1;
/* 布尔值 */
const e: boolean = True;
/* null*/
const r: null = null;
/* undefined */
const t: undefined = undefined;

对象类型

在对象的某个或某些属性前加上关键字 readonly,可以设置该属性为只读属性。对象的只读属性在TS里一般不允许被重新赋值。只读属性不意味着完全不能修改。如果只读属性是一个对象类型,那我们可以修改它里面的成员。

然而事实上,在TS里我们依然有方法可以让只读属性被重新赋值。由于TS的类型检查机制,在检查两个对象类型是否兼容时,只针对类型,而不会去检测属性是否有 readonly 。例如,下面这两个对象类型是完全相互兼容的。

我们可以通过一个不具有相应只读属性,且属性类型能够兼容的对象,来重写另一个对象的只读属性。因此,在使用只读属性时,一定要注意这种情况,以免引起超出意料的困扰。

函数类型

TypeScript 里,我们可以通过 function 字面量和箭头函数的形式定义函数,如下所示:

function add() {}
const add = () => {}

还可以显式指定函数参数和返回值的类型,如下所示:

const add = (a: number, b: number): number => {
  return a + b;
}

如上述示例中,参数名后的 :number 表示参数类型都是数字类型,圆括号后的 : number则表示返回值类型也是数字类型。下面介绍一下返回值类型和参数类型。

返回值类型

在 JavaScript 中,如果一个函数可以没有显式 return,此时函数的返回值是 undefined

在 TypeScript 中,如果我们显式声明函数的返回值类型为 undfined,会报错

正确的做法是使用void 类型来表示函数没有返回值的类型(void 类型很少用到,这基本是唯一有用的场景)

function func(): void {
  ......
}
func().someFunc();

参数类型

函数重载。可以为同一个函数提供多个函数类型定义来进行函数重载(函数名称相同,参数数量或类型不同, 或者参数数量相同同时参数顺序不同)。

如何进行定义? 定义函数重载需要定义重载签名和一个实现签名。 其中重载签名定义函数的形参和返回类型,没有函数体。 一个函数可以有多个重载签名:主要是可以精确显示函数的输入输出,对应于调用该函数的不同方式。 此外, 实现签名还具有参数类型和返回类型,而且还有实现函数的主体,且只能有一个实现签名。 实现签名主要是将所有的输入输出类型做一个全量定义,防止TS编译报错,实现签名就是整个整个函数实现的全部逻辑 。