type A = {
name: string,
age: number
}
type B = keyof A // 'name' | 'age'
如果类型用了索引签名
type A = {
[n:number]:unknown
}
type B = keyof A //number
----------------------------
type C = {
[k:string]:unknown
}
type D = keyof C // number | string
索引访问类型(获取属性值的类型)
interface Person = {
age: number,
name: string
}
// 中括号里放的是一个类型,如下'age'也是一个字面量类型
type Age = Person['age'] // number
type A = Person['age' | 'name'] // number | string
typeof
const myArr = [
{name: 'jim', age: 18},
{name: 'tom', age: 20}
]
// typeof + 索引访问类型的结合使用
type Person = typeof myArr[number] // {name: string, age: number}
type Age = typeof myArr[number]['age'] // number
条件类型
用type来定义的泛型
通过extends约束作为判断,来进行衍生
传入的是联合类型,将得到分布式的结果
interface IdLabel {
id: number
}
interface NameLabel {
name: string
}
type NameOrId<T extends string | number> = T extends number ? IdLabel: NameLabel
------------------------------------------------
interface Email {
message: string
}
type Messageof<T> = T extends {message: unknown} ? T['message'] : never
type MessageContent = Messageof<Email > // string
--------------------------------------------------------
// 传入的是联合类型,将得到分布式的结果
type ToArray<T> = T extends any ? T[] : never
type StrArrOrNumArr = ToArray<string | number> // string[] | number[]