TypeScript
TS
类型定义
基础类型
- 标注类型:
let age1: number = 18
常用类型:
- 原始类型:`number/string/boolean/null/undefined/symbol
- 对象类型:
object
(包括,数组、对象、函数等对象)- 数组:
let strings: Array<string> = ['a', 'b', 'c']
- 数组:
- 联合类型
let arr: (number | string)[] = [1, 'a', 3, 'b']
例如:对于定时器
let timer:number|null = null
类型别名:
type s = string
\type MyArr = (number | string) []
函数
- 函数基础
1 | // 普通函数 |
- 函数类型别名
1 | type Fn = (n1:number,n2:number) =>number //定义Fn为类型别名 |
注意:如果什么都不写,此时,add 函数的返回值类型为: void
但是如果指定 返回值类型为 undefined,此时,函数体中必须显示的 return undefined 才可以
- 可选参数
以?
标识
1 | function mySlice(start?: number, end?: number): void { |
对象
- 对象新建并赋值
1 | const goodItem:{name: string, price: number, func: ()=>string,email?: string } = { |
- 定义对象
1 | type Person = { |
此后你可以在如下地方使用Person类:
1 | // 使用类型别名作为对象的类型: |
接口
基本和类相似
1 | interface IGoodItem { |
接口,只能为对象指定类型。它可以继承。
一般来讲,能用type就用类
接口其他
?
标识可选- 可以调用接口本身属性
1 | interface UserItem { |
接口继承
1 | interface UserItem { |
如果觉得这个 Admin
类型不需要记录这么多属性,也可以在继承的过程中舍弃某些属性,通过 Omit
帮助类型来实现,Omit
的类型如下:
1 | type Omit<T, K extends string | number | symbol> |
其中 T
代表已有的一个对象类型, K
代表要删除的属性名,如果只有一个属性就直接是一个字符串,如果有多个属性,用 |
来分隔开,下面的例子就是删除了两个不需要的属性:
1 | interface UserItem { |
元组
确切标识数组的每个元素的类型和长度
let position: [number, number] = [39.5427, 116.2317]
:限定了每一个元素的类型,以及长度只能为2 (该示例中,元素有两个元素,每个元素的类型都是 number)
1 | function useState(n: number): [number, (number)=>void] { |
字面量
只能且只能是字面量初始化的内容。不能更改为其他
1 | const str2 = 'hello 武汉' //str2无法更改,也算字面量 |
枚举
枚举是可以同时存在的。
1 | enum Direction { |
举个例子
1 | enum Gender { |
any类型
当类型设置为 any 时,就取消了类型的限制。
类型方法
类型断言
案例1:1
2const box = document.getElementById('img') as HTMLImageElement
box.src
document.getElementById
方法返回值的类型是 HTMLElement,其不存在src的属性,可以断言为更细致的类型
案例2:1
2
3
4
5
6type User = {
name: string,
age: number
}
const u1 = {} as User
在设置初始值时候,结果是用ajax拿到的,可以这样设置。
TypeOf
typeof 操作符,用来在 JS 中获取数据的类型
可以使用type 类型 = typeof 常量
简化类型书写,我可以直接获取res的类型
1 | const res = { name: '小花', city: '武汉', skills: ['js', 'css'] }//ajax请求 |
交叉类型
1 | interface Person{name:string} |
使用交叉类型后,新的类型PersonDetail
就同时具备了Person
和Contact
的所有的属性类型。
注意:对于同名属性之间,不会报错(使用接口继承会报错)
泛型
泛型,顾名思义,就是可以适用于多个类型
使用类型变量比如T帮助我们捕获传入的类型,之后我们就可以继续使用这个类型。
泛型函数
语法:在函数名称的后面写 <>
(尖括号),尖括号中添加类型变量
1 | function fn<T>(value: T): T { return value } |
举个例子:1
2
3
4
5
6
7
8
9
10
11
12// useState它接收一个任意类似的数据,返回一个数组。数组的第一个元素的类型与入参一致; 数组的第二个元素是一个函数,函数的入参类型和返回值类型与useState的入参一致
function useState<T>(p:T): [T,(p:T)=>T] {
const t = (p: T):T => {
return p
}
return [p, t]
}
const arr1 = useState('123')
const arr2 = useState(123)
添加泛型约束
当比如需要获取一个元素的length,但是使用了泛型,那么必须保证他有length才可以
1 | //方式1: |
多个类型
1 | function getProp<Type, Key extends keyof Type>(obj: Type, key: Key) { |
- 添加了第二个类型变量 Key,两个类型变量之间使用
,
逗号分隔。 - keyof 关键字接收一个对象类型,生成其键名称(可能是字符串或数字)的联合类型。
本示例中
keyof Type
实际上获取的是 person 对象所有键的联合类型,也就是:'name' | 'age'
- 类型变量 Key 受 Type 约束,可以理解为:Key 只能是 Type 所有键中的任意一个,或者说只能访问对象中存在的属性
泛型接口
1 | interface MyArray<T> { |
泛型工具
1. Partial
构造(创建)一个类型,将 Type 的所有属性设置为可选。
2. Readonly
构造(创建)一个类型,将 Type 的所有属性设置为只读
3. Pick
Pick<Type, Keys>
从 Type 中选择一组属性来构造新类型。
1 | type Props = { |
构造出来的新类型:
- PartialProps 结构和 Props 相同,但所有属性都变为可选的。
- ReadonlyProps 结构和 Props 相同,但所有属性都变为只读的。
- 构造出来的新类型 PickProps,只有 id 和 title 两个属性类型。
4. Record
Record<Keys,Type>
:构造一个对象类型,属性键为keys
,属性类型为Type
。
1 | let arg4: Record<number, string> = { |
类型声明
在.d.ts
文件中,包含类型信息的类型声明文件
补充
tsconfig
1 | { |