搭建学习环境
进入 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
}
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)