Type Script 学习笔记

本文介绍了TypeScript的元组特性和基础类型,包括布尔值、数字、字符串、数组、元组、枚举、any、void、Null和Undefined、never、object以及symbol。还提到了变量声明、解构赋值和接口的概念,强调了TypeScript在类型检查上的严格性。

# Type Script 学习笔记

## 官方文档有坑

1. typescript 2.7后,元祖长度被固定,访问元祖越界元素会报错,官方文档中的教程尚未更新。

## 基础类型

1. 布尔值: `let isDone: boolean = false;`

2. 数字:

```

let decLiteral: number = 6 // 十进制

let hexLiteral: number = 0xf00d // 十六进制

let binaryLiteral: number = 0b1010 // 二进制

let octalLiteral: number = 0o744 // 八进制

```

3. 字符串: `let name: string = "bob"`

4. 数组: `let list: number[] = [1, 2, 3]`, `let list: Array<number> = [1, 2, 3]`

5. 元组: 元组类型允许表示一个已知元素数量和类型的数组, 各元素类型不必相同。

- 数量和类型应该对应, 例:

```

let x: [string, number]

x = ['hello', 123] // Ok

x = [123, 'hh'] // Error

x = [123, 'hh', 123] // Error

```

6. 枚举 enum

- 可以为一组数值赋予友好的名字。

```

enum Color { Red, Green, Blue }

let c: Color = Color.Green

```

- 默认 Color[0] Red, Color[1] Green, Color[2] Blue

- 可以定义 Red = 1, 则 Color[1] Red, Color[2] Green, Color[3] Blue

```

enum Color { Red = 1, Green, Blue }

let c: Color = Color.Green // 2

```

- 可以全部手动赋值

```

enum Color { Red = 1, Green=3, Blue=6 }

let colorName: String = Color[6] // 'Blue'

```

7. any: 任意类型

- 允许在编译时可选地包含或移除类型检查。

```

let list: any[] = [1, true, "free"]

list[1] = 100

```

8. void: 与 any 类型相反,表示没有任何类型,

- 函数没有返回值的时候使用

```

function warning(): void {}

```

- 如果生命一个变量只能赋值 undefined 和 null

```

let und: void = undefined

```

9. Null 和 Undefined

- vscode 中设置 strict null check

```

let u: undefined = undefined

let n: null = null

```

10. never 类型可以赋值给任何类型和 never 类型

```

// 返回never的函数必须存在无法达到的终点

function error(message: string): never {

throw new Error(message);

}

// 推断的返回值类型为never

function fail() {

return error("Something failed");

}

// 返回never的函数必须存在无法达到的终点

function infiniteLoop(): never {

while (true) {

}

}

```

11. object 类型

- 也就是除number,string,boolean,symbol,null或undefined之外的类型。

12. symbol 类型, es6新类型, 唯一

```

symbol('xxx') === symbol('xxx') // false

symbol.for("xxx") === symbol.for("xxx") // true

```

- 使用 symbol 类型作为对象的属性, 不能使用 for in 遍历

```

let keys = Reflect.ownKeys(person)

keys.forEach(element => { console.log(person[element]) })

```

- Reflect, Es6 提供新对象。

13. 联合类型 `string | null | undefined`

## 变量声明

- let: 块级作用域, 可以理解为在 `{}` 中起作用, 声明前不能调用。

- const: 块做用户, 值不可以修改,状态可以修改。

## 解构

- 数组 `[a, b] = [1, 2]`

- 重命名: `let { a: newName1, b: newName2 } = o;`

- 对象带类型: `let {a, b}: {a: string, b: number} = o;`

- 数组余量

```

let [first, ...rest] = [1, 2, 3, 4];

console.log(first); // outputs 1

console.log(rest); // outputs [ 2, 3, 4 ]

```

- 对象余量

```

let { a, ...passthrough } = o;

let total = passthrough.b + passthrough.c.length;

```

- `{` 开头会被认为是一个块 `({ a, b } = { a: "baz", b: 101 })`

- 默认值, ? 为可空

```

function keepWholeObject(wholeObject: { a: string, b?: number }) {

let { a, b = 1001 } = wholeObject;

}

```

- 解构应尽量简单化,避免

```

function f({ a, b = 0 } = { a: "" }): void {

// ...

}

f({ a: "yes" }); // ok, default b = 0

f(); // ok, default to {a: ""}, which then defaults b = 0

f({}); // error, 'a' is required if you supply an argument

```

- 展开, 与解构相反

```

let first = [1, 2];

let second = [3, 4];

let bothPlus = [0, ...first, ...second, 5];

// [0,1,2,3,4,5]

```

- 数组的展开, 后边的属性会覆盖前边的属性, 并且会丢失对象的方法

```

let defaults = { food: "spicy", price: "$$", ambiance: "noisy" };

let search = { ...defaults, food: "rich" };

```

## 接口

- 接口规定了函数参数的类型和属性

```

interface SquareConfig {

color?: string;

width?: number;

}

```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值