TypeScript学习笔记

TypeScript学习笔记

Marzm

本笔记是来自翻阅xcatliu TypeScript入门教程文档

此笔记文件于某一时间截取复制至此,只截取了上方 A_TypeScript 学习笔记部分笔记的部分知识点至此,方便网站阅读

简介

什么是 TypeScript

Typed JavaScript at Any Scale.
添加了类型系统的 JavaScript,适用于任何规模的项目。

以上描述是官网 对于 TypeScript 的定义。

它强调了 TypeScript 的两个最重要的特性——类型系统、适用于任何规模。

安装 TypeScript

TypeScript 的命令行工具安装方法如下:

1
npm install -g typescript

以上命令会在全局环境下安装 tsc 命令,安装完成之后,我们就可以在任何地方执行 tsc 命令了。

编译一个 TypeScript 文件很简单:

1
tsc hello.ts

我们约定使用 TypeScript 编写的文件以 .ts 为后缀,用 TypeScript 编写 React 时,以 .tsx为后缀。

基础

原始数据类型

JavaScript 的类型分为两种:原始数据类型(Primitive data types )和对象类型(Object types)。

原始数据类型包括:布尔值、数值、字符串、nullundefined 以及 ES6 中的新类型 Symbol 和 ES10 中的新类型 BigInt。

本节主要介绍前五种原始数据类型在 TypeScript 中的应用。

布尔值

布尔值是最基础的数据类型,在 TypeScript 中,使用 boolean 定义布尔值类型:

1
2
3
4
let isDone: boolean = false

// 编译通过
// 后面约定,未强调编译错误的代码片段,默认为编译通过

注意,使用构造函数 Boolean 创造的对象不是布尔值:

1
2
3
4
let createdByNewBoolean: boolean = new Boolean(1)

// Type 'Boolean' is not assignable to type 'boolean'.
// 'boolean' is a primitive, but 'Boolean' is a wrapper object. Prefer using 'boolean' when possible.

事实上 new Boolean() 返回的是一个 Boolean 对象:

1
let createdByNewBoolean: Boolean = new Boolean(1)

直接调用 Boolean 也可以返回一个 boolean 类型:

1
let createdByBoolean: boolean = Boolean(1)

在 TypeScript 中,boolean 是 JavaScript 中的基本类型,而 Boolean 是 JavaScript 中的构造函数。其他基本类型(除了 nullundefined)一样,不再赘述。

数值

使用 number 定义数值类型:

1
2
3
4
5
6
7
8
let decLiteral: number = 6
let hexLiteral: number = 0xf00d
// ES6 中的二进制表示法
let binaryLiteral: number = 0b1010
// ES6 中的八进制表示法
let octalLiteral: number = 0o744
let notANumber: number = NaN
let infinityNumber: number = Infinity

编译结果:

1
2
3
4
5
6
7
8
var decLiteral = 6
var hexLiteral = 0xf00d
// ES6 中的二进制表示法
var binaryLiteral = 10
// ES6 中的八进制表示法
var octalLiteral = 484
var notANumber = NaN
var infinityNumber = Infinity

其中 0b10100o744ES6 中的二进制和八进制表示法 ,它们会被编译为十进制数字。

字符串

使用 string 定义字符串类型:

1
2
3
4
5
6
let myName: string = 'Tom'
let myAge: number = 25

// 模板字符串
let sentence: string = `Hello, my name is ${myName}.
I'll be ${myAge + 1} years old next month.`

编译结果:

1
2
3
4
5
var myName = 'Tom';
var myAge = 25;
// 模板字符串
var sentence = "Hello, my name is " + myName + ".
I'll be " + (myAge + 1) + " years old next month.";

其中 ` 用来定义 ES6 中的模板字符串

${expr} 用来在模板字符串中嵌入表达式。

空值

JavaScript 没有空值(Void)的概念,在 TypeScript 中,可以用 void 表示没有任何返回值的函数:

1
2
3
function alertName(): void {
alert('My name is Tom')
}

声明一个 void 类型的变量没有什么用,因为你只能将它赋值为 undefinednull(只在 –strictNullChecks 未指定时):

1
let unusable: void = undefined

Null 和 Undefined§
在 TypeScript 中,可以使用 nullundefined来定义这两个原始数据类型:

1
2
let u: undefined = undefined
let n: null = null

void 的区别是,undefinednull 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 number 类型的变量:

1
2
3
4
5
// 这样不会报错
let num: number = undefined
// 这样也不会报错
let u: undefined
let num: number = u

void 类型的变量不能赋值给 number 类型的变量:

1
2
3
4
let u: void
let num: number = u

// Type 'void' is not assignable to type 'number'.

任意值

任意值(Any)用来表示允许赋值为任意类型。

什么是任意值类型

如果是一个普通类型,在赋值过程中改变类型是不被允许的:

1
2
3
4
let myFavoriteNumber: string = 'seven'
myFavoriteNumber = 7

// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.

但如果是 any 类型,则允许被赋值为任意类型。

1
2
let myFavoriteNumber: any = 'seven'
myFavoriteNumber = 7

任意值的属性和方法

在任意值上访问任何属性都是允许的:

1
2
3
let anyThing: any = 'hello'
console.log(anyThing.myName)
console.log(anyThing.myName.firstName)

也允许调用任何方法:

1
2
3
4
let anyThing: any = 'Tom'
anyThing.setName('Jerry')
anyThing.setName('Jerry').sayHello()
anyThing.myName.setFirstName('Cat')

可以认为,声明一个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值。

未声明类型的变量

变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型:

1
2
3
4
5
let something
something = 'seven'
something = 7

something.setName('Tom')

等价于

1
2
3
4
5
let something: any
something = 'seven'
something = 7

something.setName('Tom')

类型推论

如果没有明确的指定类型,那么 TypeScript 会依照类型推论(Type Inference)的规则推断出一个类型。

什么是类型推论

以下代码虽然没有指定类型,但是会在编译的时候报错:

1
2
3
let myFavoriteNumber = 'seven'
myFavoriteNumber = 7
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.

事实上,它等价于:

1
2
3
4
let myFavoriteNumber: string = 'seven'
myFavoriteNumber = 7

// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.

TypeScript 会在没有明确的指定类型的时候推测出一个类型,这就是类型推论。

如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查:

1
2
3
let myFavoriteNumber
myFavoriteNumber = 'seven'
myFavoriteNumber = 7
  • 标题: TypeScript学习笔记
  • 作者: Marzm
  • 创建于: 2023-04-04 14:05:33
  • 更新于: 2023-06-14 01:54:36
  • 链接: https://marzm.cn//post/typescript.html
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论