类型演算

本文深入解析TypeScript中的类型操作,包括typeof、keyof、in等关键字的使用,以及Partial、Required、Readonly等预定义类型演算。通过具体示例说明如何在类、接口和类型别名中应用这些特性。
摘要由CSDN通过智能技术生成

根据已知的类型计算出一个新的类型

三个关键字

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值