interfacePerson{
name:string
age:number}const amin: Person ={
name:"amin",
age:17}type Amin =typeof amin // type Amin = Personconst person: Amin ={// const person: Person
name:"小明",
age:18}typeSum=(a:number, b:number)=>numberconst sum:Sum=(a, b)=> a + b
type Add =typeof sum // type Add = (a: number, b: number) => numberconst add:Add=(a, b)=> a + b // const add: Sumconst res =add(5,5)// const res: numberconsole.log(res)// 10
keyof 获取某种类型的所有键 返回联合类型 a | b | c
interfacePerson{
name:string
age:number}type PersonKeys = keyof Person // type PersonKeys = "name" | "age"type PersonKeys2 = keyof Person[]// 数组的属性// type PersonKeys2 = number | "length" | "toString" | // "toLocaleString" | "pop" | "push" | "concat" | "join" | "reverse" |// "shift" | "slice" | "sort" | "splice" | "unshift" | "indexOf" | // "lastIndexOf" | ... 14 more ... | "includes"type PersonKeys3 = keyof {[x:string]: Person}// type PersonKeys3 = string | number // ts支持数字索引和字符串索引 keyof一个对象类型 返回的就是 string | number classPerson{
name:stringconstructor(name:string){this.name = name
}nameLenght(){returnthis.name.length
}}typeP= keyof Person // type P = "name" | "nameLenght"
in 遍历枚举类型
interfacePerson{
name:string
age:number}type PersonKeys = keyof Person // type PersonKeys = "name" | "age"type Person2 ={[Pin PersonKeys]: Person[P]}// type Person2 = { name: string, age: number }
infer 占位 声明一个类型
type ReturnType<Textends(...args:any[])=>any>=Textends(...args:any[])=> infer R?R:anytypeSum=(a:number, b:number)=>numbertypeR1= ReturnType<Sum>// type R1 = numberconst sum: Sum =(a:number, b:number):R1=> a + b // type Sum = (a: number, b: number) => number// ReturnT<Sum> 就是函数返回值的类型const res =sum(2,3)// const res: numberconsole.log(res)// 5
extends 继承类
interfacePerson{
name:string
age:number}interfacePextendsPerson{
hobby:string[]}// 空对象时 Type '{}' is missing the following properties from type 'P': hobby, name, age(2739)const person:P={
name:"zf",
age:10,
hobby:["teach","eat","sleep"]}// ---------------------------------------------------------------classPerson{
name:string
age:numberconstructor(name:string, age:number){this.name = name
this.age = age
}}interfacePextendsPerson{
hobby:string[]}// 空对象时 Type '{}' is missing the following properties from type 'P': hobby, name, age(2739)const person:P={
name:"zf",
age:10,
hobby:["teach","eat","sleep"]}
Partial 将类型的属性转成可选项?
type Person ={
name:string
age:number}typeP= Partial<Person>// type P = {// name?: string | undefined;// age?: number | undefined;// }const person:P={
name:"zf"}
Pick 从目标类型中 获取制定属性的类型
type Pick<T,UextendskeyofT>={[key inU]:T[key]}type Person ={
name:string
age:number}typeP= Pick<Person,"name">// type P = {// name: string// }typeP2= Pick<Person,"name"|"age">// type P2 = {// name: string// age: number// }
Mutable Readonly
type Person ={
readonly name:string
age:number}const person: Person ={
name:"amin",
age:18}
person.age =17
person.name ="zf"// Cannot assign to 'name' because it is a read-only property.// --------------------------------------type Mutable<T>={-readonly [Pin keyof T]:T[P]// 去除属性的只读属性}type Person ={
readonly name:string
age:number}const person: Mutable<Person>={
name:"amin",
age:18}
person.age =17
person.name ="zf"// ---------------------------------------------type Readonly<T>={+readonly [Pin keyof T]:T[P]// 添加属性的只读属性}type Person ={
name:string
age:number}const person: Readonly<Person>={
name:"amin",
age:18}
person.age =17// Cannot assign to 'age' because it is a read-only property.(2540)
person.name ="zf"// Cannot assign to 'name' because it is a read-only property.(2540)
Record
type Record<Kextendskeyofany,T>={[PinK]:T};type Sum ={
a:any,
b:any}// 将类型中所有的键的类型都转成目标类型const sum: Record<keyof Sum,number>={
a:5,
b:6}
Exclude
type Exclude<T,U>=TextendsU? never :T;// 从T中找出U中没有的值type PersonKeys = Exclude<"name"|"age"|"gender","name"|"hobby">// type Person = "age" | "gender"
Extract
type Extract<T,U>=TextendsU?T: never;// 从T中找出U中有的值type PersonKeys = Extract<"name"|"age"|"gender","name"|"hobby">// type PersonKeys = "name"