📔
饥人谷前端体系课程笔记
黑马程序员笔记前端面试押题前端精进
  • 课程大纲
  • Git入门
    • 3. 软件安装详解
    • 4. Mac环境搭建
    • 5. 命令行入门
    • 6. 本地仓库
    • 7. Git远程仓库-GitHub
  • HTML全解
    • 8. HTML概览
    • 9. HTML标签
    • 10. HTML重难点
    • 11. HTML实践 & 手机调试
  • CSS全解
    • 12. CSS基础
    • 13. CSS布局(上)
    • 14. CSS布局(下)
    • 15. CSS定位
    • 16. CSS动画
  • HTTP全解
    • 17. URL 是什么
    • 18. 请求和响应 & Node.js Server
  • JS全解
    • 19. JavaScript概览
    • 20. 内存图与JS世界(精品课)
    • 21. Canvas 实践—画图板
    • 22. JS语法
    • 23. JS数据类型
    • 24. JS 对象
    • 25. JS 对象分类
    • 26. JS 数组
    • 27. JS 函数
    • 28. JS 实战,会动的代码
    • 29. JS运算符
    • 30. JS总结
  • JS编程接口
    • 31. DOM编程
    • 32. 手写DOM库
    • 33. JQuery中的设计模式(上)
    • 34. JQuery中的设计模式(下)
    • 35. DOM事件与事件委托
  • 项目 前端导航站点
    • 前端导航项目笔记
  • 前后分离
    • 40. AJAX的原理
    • 41. 异步与Promise
    • 42. 跨域、CORS、JSONP
    • 43. 静态服务器
    • 44. AJAX实战:Cookie、Session
  • JS进阶MVC
    • 48. MVC(上)
    • 49. MVC(中)
    • 50. MVC(下)
  • 项目构建
    • 51. Webpack(上)
    • 52. Webpack(下)
  • 算法与数据结构
    • 62. 伪代码与流程图
  • React全解
    • 75. React起手式
    • 76. React类组件和函数组件
    • 77. Class组件详解
    • 78. 函数组件
    • 79. Hooks原理解析
    • 80. Hooks各个击破
    • 81. 精通Redux
  • Node.js
    • 84. Node.js技术架构
    • 85. 文件模块
    • 86. 单元测试之文件模块
    • 87. 调试 Node.js 程序
    • 88. 静态服务器
    • 89. 命令行翻译工具
    • 90. 操作数据库
    • 91. 数据库基础知识
    • 92. Stream 流
    • 93. child_process
    • 94. 总结
  • TypeScript
    • 112. 基础
    • 113. 泛型
  • Next.js全解
    • Next.js 上
    • Next.js 下
  • ES6精讲
    • Promise,async/await
  • 大屏可视化笔记
    • 大屏可视化项目
  • SCSS全解
    • SCSS全解
  • 拓展
    • 一次性弄懂性能优化
    • Web性能优化
由 GitBook 提供支持
在本页
  • 类型 vs 类
  • JS中的类
  • 类型的两个好处
  • TS的类型
  • TS的函数怎么写
  • tuple
  • enum
  • 如何给不同数据加type
  • 联合类型(|)和交叉类型(&)
  • 怎么声明div的类型

这有帮助吗?

  1. TypeScript

112. 基础

可以直接在.ts的文件里写javascipt。

运行ts有三种方法

  1. webpack + babel(用babel把ts变成js文件)

  2. Vite 2

    yarn create vite
    yarn create vite my-react-app --template react 

    会让选择用js还是ts,选择ts

    cd my-react-app
    yarn
    yarn dev
  3. tsc

    tsc x.ts

使用tsc会比较麻烦,每次都需要把ts文件变成js文件,再用node执行,因此第一和第二种方法更通用。

tsx和ts的区别

tsx = ts + jsx

ts = ts

webpack + ts = ts + jsx

类型 vs 类

var x: string = 'hi'

就是在变量后面加个冒号:,然后加一个type

有两个bug需要注意下

typeof Object返回的是function

typeof null返回是object

JS中的类

面向对象编程有两种,

  1. 基于class关键字

    class Person{
    	属性1
    	属性2
    	属性3
    	方法1
    	方法2
    	方法3
    }
    const p1 = new Person()
    p1.属性1
    p2.方法1()
  2. 基于原型

function Person(){
	var temp = {}
	temp.属性1
	temp.属性2
	temp.方法1
	temp.方法2
	return temp
}	
const p1 = Person()
p1.属性1
p1.方法1()

类型的两个好处

  1. 减少bug

在运行之前就可以发现错误。

//js经典错误
const str = '1';
console.log(str + 1);//return 的是11
  1. 可以做更牛逼的提示

TS的类型

const a: undefined = undefined;
const b: null = null;
const c: string = 'hi';
const d: boolean = true;
const e: symbol = Symbol('hi')
const f: bigint = 123n;
const obj:object = {}
const obj0:Object = {}
const arr:Array<string|number|null> = ['1','2',3,null]

const add = (a:number, b:number):number => a + b;
//输入a是一个number,输入一个b也是一个number,返回的也是number

TS的函数怎么写

  1. 类型写在函数体

    const add1 = (a:number, b:number) => a + b
  2. :后面

    const add2 = (a:number, b: number) => number = (a, b)=>a + b
  3. type缩写

    type Add = (a: number, b: number)=> number
    const add3: Add = (a, b) => a + b
  4. 有属性,只能用interface

    interface AddWithProps{
      (a:number, b:number):number
      xxx: string
    }
    const add2:AddWithProps = (a, b) => a + b;
    add2.xxx = 'yyy';

    TS中的any, unknown, void, never, enum, tuple

    any

    let a: any = "hi"
    a = 1

    unknown

    type B = {name: string}
    let b: unknown = JSON.parse('{"name":"frank"}')
    (b as B).name //断言

    通常使用在从外部获取到的数据,但是用之前需要明确

    void

    let print:() => void = function(){
    	console.log(1)
    	return 2
    }

    void用于函数return,表示空

    never

    type Dir = 1 | 2 | 3 | 4
    let dir : Dir = 1
    
    switch(dir){
    	case 1:
    		break;
    	case 2:
    		break;
    	case 3:
    	 	break;
    	case 4:
    		break;
    	case undefined:
    		break;
    	default:
    		console.log(dir)
    		break;
    }

    never就是不应该出现的类型

type X = number & string //never
type Y = (1 | 2 |3) & (2 | 3 | 4)//2, 3

tuple

let p :[number, number] = [100,200]
let p2:[number, string, boolean] = [100, 'x', true]

元组是不可变更长度的数组

enum

enum Dir2{东, 南, 西, 北}
let d: Dir2 = Dir2.东
let d2: Dir2 = Dir2.西
console.log(d)

type Dir = "东" | "南" | "西" | "北"
type Dir3 = 0 | 1 | 2 | 3
let dir: Dir = "东"
let dir2: Dir = "男"

枚举, 不常用

如何给不同数据加type

范型就是给一个类型传一个参数

const a: Array<number> = [1, 2, 3]

Function不是范型

class是值还是类型?全都是

class A{

}
const B = A
const a:A = new A()

联合类型(|)和交叉类型(&)

联合类型

type A = {
  name:string;
  age:number;
}

type B = {
  name: string;
  gender: string;
}

const f = (n:number | B) =>{
  
}

联合类型还可以收窄数据范围

type A = 1 | 2

交叉类型

type A = number & string;
const a:A = 1
//会提示a是never,因为number和string没有交集

因此交叉类型不能是简单的将那八种类型组合

type A = {name: string} & {age:number}
const a :A = {name:"hi", age:5}

&一般是用来连接两个复杂类型

但是下面的例子会出现never,因为age出现了两种数据类型

type A = {name: string, age:boolean} & {age:number}
const a :A = {name:"hi", age:5}

怎么声明div的类型

const value = (document!.getElementById('xxx')! as HTMLInputElement).value
f(parseInt(value))
上一页TypeScript下一页113. 泛型

最后更新于2年前

这有帮助吗?

可以看这篇

文章