Blog
首页
文档
收藏
关于
  • 在线转换时间戳 (opens new window)
  • 在线压缩图片 (opens new window)
  • Float-Double转二进制 (opens new window)
  • 文件转Hex字符串 (opens new window)

HiuZing

🍑
首页
文档
收藏
关于
  • 在线转换时间戳 (opens new window)
  • 在线压缩图片 (opens new window)
  • Float-Double转二进制 (opens new window)
  • 文件转Hex字符串 (opens new window)
  • 前端面试题

  • JavaScript

  • Vue2

  • port

  • CSS

  • Node.js

  • JavaScript优化

  • uniapp

  • Mini Program

  • TypeScript

    • 基础

      • TypeScript介绍
        • TypeScript介绍
          • 安装TypeScript
          • 安装 ts-node
        • 总结
          • 基础类型
          • 特殊类型
          • 高级类型
          • 工具类型
      • TypeScript基础类型
      • TypeScript对象类型
      • TyprScript类型推论
      • TypeScript高级类型
      • TypeScript接口
      • TypeScript类型别名与接口的区别
      • TypeScript泛型
      • TypeScript项目配置
    • 实例

  • JavaScript 面向对象

  • UI组件

  • Plugin

  • Vue3

  • 性能优化

  • Axios

  • 状态管理

  • React

  • Mock

  • Icon

  • Template

  • 构建工具

  • 项目规范配置

  • Taro

  • SVG

  • React Native

  • Three.js

  • 前端
  • TypeScript
  • 基础
HiuZing
2022-09-27
目录

TypeScript介绍

# TypeScript介绍

TypeScript——静态类型编辑语言(编译期做类型检查)

JavaScript——动态类型编辑语言(执行器做类型检查)

代码编译和代码执行顺序

  1. 编译
  2. 执行

# 安装TypeScript

npm install -g  typescript // 全局安装 ts
1

是否已经安装过 typescript 的,可以使用以下命令来验证:(如果出现版本,则说明已经安装成功)

tsc -v 
1

生成 tsconfig.json 配置文件

tsc --init
1

在我们文件中,随便写点什么

const s:string = "彼时彼刻,恰如此时此刻";
console.log(s);
1
2

控制台执行 tsc xxx.ts 命令,目录下生成了一个同名的 xxx.js 文件

var s = "彼时彼刻,恰如此时此刻";
console.log(s);
1
2

通过tsc命令,发现我们的typescript代码被转换成了熟悉的js代码

我们接着执行

node helloworld.js
1

# 安装 ts-node

那么通过我们上面的一通操作,我们知道了运行tsc命令就可以编译生成一个js文件,但是如果每次改动我们都要手动去执行编译,然后再通过 node命令才能查看运行结果岂不是太麻烦了

npm i -g ts-node // 全局安装ts-node
1

有了这个插件,我们就可以直接运行.ts文件了

ts-node xxx.ts
1

可以看到我们的打印结果已经输出

具体来源 (opens new window)

# 总结

TypeScript 的类型主要分为基础类型、特殊类型和高级类型。

# 基础类型

# string

字符串

# number

数字

# boolean

布尔值

# undefined

# null

# symbol

# bigint

# object

# 特殊类型

# any

任意类型,会关闭类型检查

# unknown

未知类型,比 any 更安全,需要类型收窄后才能使用

# never

永远不会出现的类型,比如抛异常或者死循环函数

// 函数抛出异常
// 抛出异常,函数不会return,返回类型是 never
function error(): never {
  throw new Error("出错了!")
}

const res = error()
// res 的类型是 never,不会有值

// 死循环,代码永远执行不完
function loop(): never {
  while(true) {
    // 无限循环,函数永远不会退出
  }
}

// 穷尽检查
type Status = 'loading' | 'success' | 'fail'

function handleStatus(s: Status) {
  switch(s) {
    case 'loading': break
    case 'success': break
    // 故意少写 fail 的case
    default: {
      // 当新增状态,但是忘记处理分支,s会变成never
      const check: never = s
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# void

通常表示函数没有返回值

# 高级类型

# union

联合类型,满足其中任意一种类型即可

// 可以是string,也可以是number
type Union = string | number

let a: Union
a = 'abc' // ✅
a = 123   // ✅
a = true  // ❌ boolean不在联合内,报错
1
2
3
4
5
6
7

# intersection

交叉类型,必须同时满足全部类型

interface User {
  id: number
  name: string
}

interface Admin {
  role: string
}

// 交叉:同时拥有User + Admin全部属性
type AdminUser = User & Admin

const u: AdminUser = {
  id: 1,
  name: "张三",
  role: "super"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# tuple

元组类型

 const tuple: [number, string] = [1, "zhangmazi"];
1

# enum

枚举类型

enum Color {
  RED,
  PINK,
  BLUE,
}

const red: Color = Color.RED;
console.log(red); // 0
1
2
3
4
5
6
7
8

# literal

字面量类型

// 字符串字面量
let status: 'success' | 'fail' | 'loading'

status = 'success'   // ✔合法
status = 'error'    // ❌报错,不在字面量范围内
1
2
3
4
5

# interface

接口,主要描述对象,支持extends继承,重复声明自动合并,适合写对外对象、后端实体。

# type

类型别名,可以写联合、字面量、元组等任意类型;对象扩展用&交叉;不能重复定义合并。

# 工具类型

# Partial

将一个类型的所有属性变为可选的

type Partial<T> = {
  [P in keyof T]?: T[P];
};
interface Person {
  name: string;
  age?: number;
  weight?: number;
}
type PartialPerson = Partial<Person>;
// 相当于
interface PartialPerson {
  name?: string;
  age?: number;
  weight?: number;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# Required

给定类型的所有属性变为必填的

type Required<T> = {
  [P in keyof T]-?: T[P];
};
type RequiredPerson = Required<Person>;
// 相当于
interface RequiredPerson {
  name: string;
  age: number;
  weight: number;
}
1
2
3
4
5
6
7
8
9
10

# Pick

从给定的类型中选取出指定的键值,然后组成一个新的类型

type Pick<T, K extends keyof T> = {
  [P in K]: T[P];
};
type NewPerson = Pick<Person, 'name' | 'age'>;
// 相当于
interface NewPerson {
  name: string;
  age?: number;
}
1
2
3
4
5
6
7
8
9

# Omit

从给定的类型中去除出指定的键值,然后组成一个新的类型

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
type NewPerson = Omit<Person, 'weight'>;
// 相当于
interface NewPerson {
  name: string;
  age?: number;
}
1
2
3
4
5
6
7

# Record

使用传入的泛型参数分别作为接口类型的属性和值

type Record<K extends keyof any, T> = {
  [P in K]: T;
};
type MenuKey = 'home' | 'about' | 'more';
interface Menu {
  label: string;
  hidden?: boolean;
}
const menus: Record<MenuKey, Menu> = {
  about: { label: '关于' },
  home: { label: '主页' },
  more: { label: '更多', hidden: true },
};
1
2
3
4
5
6
7
8
9
10
11
12
13

# ReturnType

获取函数的返回类型

type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
type T0 = ReturnType<() => void>; // => void
type T1 = ReturnType<() => string>; // => string
1
2
3

# Parameters

用来获取函数的参数并返回序对

type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;
type T0 = Parameters<() => void>; // []
type T1 = Parameters<(x: number, y?: string) => void>; // [x: number, y?: string]
1
2
3

# Readonly

给定类型的所有属性设为只读

type Readonly<T> = {
  readonly [P in keyof T]: T[P];
};
type ReadonlyPerson = Readonly<Person>;
// 相当于
interface ReadonlyPerson {
  readonly name: string;
  readonly age?: number;
  readonly weight?: number;
}
1
2
3
4
5
6
7
8
9
10
#TS
上次更新: 2026/08/19, 01:24:11
踩坑
TypeScript基础类型

← 踩坑 TypeScript基础类型→

最近更新
01
React性能优化
08-18
02
记录一些描述
08-18
03
Swift入门
08-17
更多文章>
Theme by Vdoing | Copyright © 2021-2026 WeiXiaojing | 友情链接
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式