根据已知的类型计算出一个新的类型
三个关键字
typeof(ts 中的 typeof): 书写位置为类型约束的位置上面
// 希望 b 的类型跟 a 保持一致
const a = 'dfsfds'
let b: typeof a = 'bb'
// 当 typeof 作用于类的实例是时,得到的类型是它的构造函数
// 平时直接写 cls: A 来约束类型,cls 必须是 A 的实例
// 如果我们想让它的类型时 A 这个构造函数本身,可以像下面这样写
class A {}
function test(cls: typeof A): A {}
keyof:作用于类、接口、类型别名,用于获取其他类型中的所有成员名组成的联合类型
interface User {
loginid: string
loginpwd: string
age: number
}
function test(obj: User, name: string){
return obj[name] // 报错,因为不知道 name 是否存在于 User 中
}
// 应该像下面这样写
function test(obj: User, name: keyof User){
return obj[name]
}
in: 该关键字往往跟 keyof 连用,限制某个索引类型的取值范围
// 这样的范围太宽泛,任何的属性都可以往里面加
type Obj = {
[p: string]: string
}
const u:Obj = {}
u.name = 'fdsfdsf'
u.fdsklfds = 'ffdsfds'
// 通过使用 in 和 keyof 来限定范围
interface User {
loginId: string,
age: number
}
type Obj = {
[p in keyof User]: string // 这样属性的范围就限定到了 User,但是这里类型是限定死的,可以像下面这样写
[p in keyof User]: User[p] // 这样就跟 User 完全保持一致了
}
// 使用泛型改成通用的类型
type partial<T> = {
[p in keyof T]: T[P]
}
let u: partial<User> = {
loginId: 'fdsfds',
age: 23
}
预定义的类型演算
TS 自带的类型演算
- Partial 将类型 T 中的成员变为可选
- Required 将类型 T 中的成员变为必填
- Readonly 将 T 中的成员变为只读
- Exclude<T, U> 从 T 中剔除 U 类型中包含的属性
- Extract<T, U> 提取 T 中 U 类型包含的属性
- NonNullable 从 T 中剔除 null 和 undefined
- RetureType 获取函数返回值类型
- InstanceType 获取构造函数类型的实例类型
interface User {
age: number
name: string
}
let u:Partial<User> = {
name: 'longji',
age: 11
}
function sum(a: number, b:number) {
return a + b
}
// 由于 sum 并不是类型是一个函数,所以需要使用 typeof 将其类型取出来
let a: ReturnType<typeof sum>