TypeScript 基础 | 青训营笔记

173 阅读3分钟

这是我参与「第四届青训营」笔记创作活动的的第 9 天

Why TypeScript

  • 静态类型
    • 可读性增强:基于语法解析 TSDoc、IDE 增强。
    • 可维护性增强:在编译阶段暴露大部分错误。在多人合作的大型项目中,获得更好的稳定性和开发效率。
  • 是 JS 的超集
    • 包含于兼容所有 JavaScript 特性,支持共存。
    • 支持渐进式引入与升级。

基础语法

声明类型

const variable: type = value;

通过上述语法来声明变量并指定一个类型,同时 TypeScript 也支持自动类型推断,可以省略类型的声明。

const variable = value;

声明对象类型

对象类型在 TypeScript 中与 JavaScript 声明对象一样也是使用花括号来声明。

const obj: MyObj = {
    name: '123',
    age: 18
}

也可以使用一个 interface 来定义一个对象类型。

interface MyObj {
    name: string;
    age: number;
}

TypeScript 中对象还支持只读属性和可选属性:

interface MyObj {
    readonly id: number; // 只读
    name: string;
    age: number;
    hobby?: string; // 可选
}

函数类型

在 TypeScript 中还可以为函数添加类型声明:

function add(a: number, b: number): number {
    return a + b;
}

这里 function(): 后的类型表示该函数的返回值类型,而括号中的表示参数列表以及参数的类型。

给箭头函数定义返回值类型的格式不太一样,使用箭头来表示函数的返回值类型:

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

数组类型

在 TypeScript 中声明数组有几种方式:

type Arr1 = number[];
type Arr2 = Array<number>;
type Arr3 = [number, number, number] // 元祖
interface Arr4 = {
    [key: number]: any;
}

其他类型

空类型,表示无赋值:

type EmptyFunction = () => void;

任意类型,是所有类型的子类型:

type AnyType = any;

枚举类型,支持枚举值到枚举名的正反向映射:

enum EnumType {
    name = 'value'
}

EnumType['name'] === 'value'
EnumType['value'] === 'name'

字面量与联合类型

TypeScript 中还允许将字面量设置为类型,这样这个变量就只能拥有对应的字面量。

但通常设置单一字面量的变量是没有意义的,我们还会用到联合类型来一起声明:

type OddNum = 1 | 3 | 5 | 7 | 9;

这个变量的类型就是 1、3、5、7、9 中的任意一个数字。

泛型

泛型在定义的时候不指定具体的类型,在使用的时候才知道具体的类型。

定义泛型

定义泛型函数:

function func<T, E>(p1: T, p2: E) {}

在函数名后使用方括号定义泛型,可以定义一个或多个,然后在函数的参数列表中使用该泛型。

泛型也可以使用在 类、别名 定义中。

interface I<T> {}
class C<T> {}
type Type<T> = Array<T>

泛型约束与默认类型

我们也可以为泛型的类型添加约束

type MyType = <T extends string>(target: T) => T[];

或者是为泛型添加默认类型,当没有指定泛型的时候会使用默认的泛型类型:

type MyType<T = number> = (target: T) => T[];