搭建学习环境
进入 Node 官网安装
安装完成后使用以下命令查看是否安装完成: 安装完成后使用以下命令查看是否安装完成:
node -v
npm -v
继续安装 nrm 管理包源:
npm i nrm -g
nrm ls
nrm use taobao
全局安装 typescript:
npm i typescript -g
全局安装 ts 的编译工具,使用 ts-node 可以将 ts 文件执行
npm i ts-node -g
ts-node index.ts
npm install tslib @types/node -g
使用 TS 可以有良好的提示,使代码可读性变强,更提前发现问题
代码编写 > 代码编译 > 代码运行
开发 > 测试 > 上线
Flow
进行类型检查,后续 Vue3 也使用 Typescript
重写var/let/const 标识符: 数据类型 = 赋值
手动指定数据的类型(类型注解),不要写成大写的 String
,因为这是 JS 的一个内置类
const data: string = 'hello'
型定义的时候已经决定
any
类型,能自动推导出类型,没必要手动指定基础类型
数组和元组
- Array<元素类型>这种写法可能会存在与jsx冲突问题
- const arr1: Array
= [1, 2, 3] - 元素类型后面接上[],表示由此类型元素组成的一个数组
- [const arr2: number[] = [1, 2, 3]
- 数组里面可能有字符串和数组
- const arr3: (string | number)[] =
- [1,2,'黛玉']
- //元组已知元素数量和类型的数组,元组一定要指明类型
- const tuple:[string, number] = ['云牧', 18]
- function useState
(state: T): [T, (newState: T)=> void] - let currentState = state
- const changeState = newState
- currentState = newState
- }
- return [currentState, changeState]
- [const [count, setCount]= useState(10)
- const obj: object = {
- name:'云牧',
- }
- obj.age = 18
- obj.name='黛玉'
- const p1:{name: string; age:number } = { name:'黛玉',age:18}
- // 问号,代表某个属性可选,不一定需要
- const p2: { name: string; age?: number } = {I name:'云牧'}
-
any
,此时在其身上做任何操作都是合法的,即使访问了一个不存在的属性- function anyType(msg: any) {
- console.log(msg)
- }
unknown
类型表示一个值可以是任何类型,它是所有类型的父类型,任何类型都可以赋值给 unknown 类型,但是 unknown 类型只能赋值给 any 类型和 unknown 类型本身any
,与 any
类型不同的是,unknown
类型的变量不能直接赋值给其他类型的变量,也不能调用其上的任何方法或属性,除非先进行类型检查或类型断言,这样确保运行时的类型安全- //类型判断后才能使用 unknown类型数据
- function foo(arg: unknown) {
- if (typeof arg == 'string') {
- console.log(arg.toUpperCase())
- } else if (typeof arg == 'number') {
- console.log(arg.toFixed(2))
- }
- }
- //类型断言后使用
- function bar(arg: unknown) {
- const num = arg as number
- console.log(num.toFixed(2))
- }
never
类型表示这种永不存在值的类型case
处理,则会报错- function handleMsg(msg: string | number) {
- switch (typeof msg) {
- case 'string
- break
- }
- case 'number':
- break
- default: {
- const check: never = msg
- }
- handleMsg('hello')
- handleMsg(10)
never
会在联合类型被直接移除
这种字符串的枚举可能使用 type Direction = 'LEFT' | 'RIGHT' | 'TOP' | 'RIGHT'
可能会更好点
- type Direction = 'LEFT'|'RIGHT'|'TOP'|'BOTTOM'
- function turnDirection(direction: Direction) {}
- turnDirection('LEFT')
-
- // 方式一:使用interface
- interface IPoint{
- x: number
- readonly y: number // readonly代表只读
- z?:number //?代表可选
- }
- // 方式二:使用type
- type Point = {
- X: number
- y: number
- }
索引签名(Index Signatures)
extends
关键字- interface Animal {
- running: () => void
- }
- interface Person{
- name: string
- age: number
- }
- //自动扩展 Person类型
- interface Person {
- sex: string
- }
-
- // 手动使用 extends 继承
- interface Student extends Person, Animal {
- id: number
- }
- const u: Student = { name:'云牧',age:18, sex: 'male', id: 1, running() }
- interface IRun {
- running: () => void
- }
- interface IEating {
- eating:() => void
- }
- class Person implements IRun, IEating {
- running(){}
- eating(){}
- }
- function run(runner: IRun) {
- runner.running()
- }
- constp = new Person()
- run(p)