functionadd(a: number, b:number): number functionadd(a: string, b:string): string functionadd(a: number | string, b: number | string): number | string {} // 这里的类型需包含之前定义的类型,也可以是顶级类型 any unknown
letvalue: any = undefined value = null value = '' value = []
unknown
unknown 可以认为是其他类型的联合类型
和 any 一样是顶级类型,所有的值都可以赋给 unknown。
letvalue: unknow = undefined value = null value = '' value = []
但 unknown 只能被赋值为 unknow 和 any
letvalue: unknow letvalue2: unknow = value letvalue3: any = vlaue letvalue4: boolean = value // error letvalue5: object = value // error
unknown 不可以直接被操作
leta: unknown type T = { name: string } a.name// 类型“unknown”上不存在属性“name”。ts(2339) // 可以使用断言或类型收窄 (a as T).name
never
never 和 any unknown 相反为底部类型(bottom type),不存在类型
// never, 不能将任何值赋给 never leta: never = 1// error leta: never = ''// error leta: never = [] // error leta: never = {} // error type T = number & string// 没有任何值属于 number 和 string 类型,所以 type T = never constfn = (a: number | string) => { if (typeof a === 'number') { // 类型为 number } elseif (typeof a === 'string') { // 类型为 string } else { // 类型为 never。对 a 进行类型收窄后,当前不存在任何类型 } }
// class 只能 extends class classPerson3extendsAction {} // error: Cannot extend an interface 'Action'. Did you mean 'implements' classPerson3extendsVehicle {}
{ [P in K]: T } // in 关键字用于遍历 K 类型中的所有类型 { [P in K]?: T } // ? 表示增加可选修饰符 { [P in K]-?: T } // -? 表示移除可选修饰符 { readonly [P in K]: T } // readonly 表示增加只读修饰符 { -readonly [P in K]?: T } // - readonly 表示移除只读修饰符
typeT1 = { [P in'a' | 'b']: string }; // type T1 = { a: string; b: string; } typeT2 = { [P in'a' | 'b']: P }; // type T1 = { a: 'a'; b: 'b'; } // as, 使用 as 可以对映射类型中的键进行重新映射,NewKeyType 必须是 string | number | symbol (联合类型)的子类 // { [K in keyof T as NewKeyType]: T[K] } typePerson = { name: string; age: number; } // type T3 = { jayname: string; jayage: string; } // { string & K } 用来过滤 K 中非 string 类型的键 typeT3 = { [K in keyof Personas`jay${string & K}` ]: string };
type F<A, B> = A | B typeResult = F<string, number> // Result: string | number
typeAdd<T> = (a: T, b: T) => T // 在使用时根据传入类型来确定泛型的类型,泛型 Add 接收一个 number,所以泛型中的 T 都为 number typeAddNumber = Add<number> // (a: number, b: number) => number constadd: Add<number> = (a, b) => a + b
// 在泛型类型中当被检查类型为联合类型,在运算过程中会被分解为多个分支 // X | Y extends U ? A : B // (X extends U ? A : B) | (Y extends U ? A : B) typeExample<T> = T extendsstring ? 'yes' : 'no'; typeT1 = Example<number | string>; // type T1 = 'yes' | 'no'
// infer 只能在条件类型(T extends X ? Y : Z)的 extends 子句中才能使用 // infer 声明的变量只能在条件类型的 true 分支中使用
typeExample<T> = T extends (infer U)[] ? U : T; // U 用于存放推断的类型 // Example 传入 string[],T 为 string[] // T extends (infer U)[] 等于 string[] extends (infer U)[],类型匹配 string 匹配 (infer U),[] 匹配 [],因此 U 为 string。 type T = Example<string[]> // type T = string
keyof
获取类型的所有 key
interfacePerson { name: string; age: number; useTools: () =>void; } typeKeys = keyof Person; // type keys = 'name' | 'age' typeValues = keyof { [key: string]: Person }; // type Values = string | number
// 没有 as const const productType = ['food', 'commodity', 'clothe']; console.log(productType.includes('')) // 此处不会有提示和报错 // 添加 as const const productType = ['food', 'commodity', 'clothe'] asconst; console.log(productType.includes('')) // error: Argument of type '""' is not assignable to parameter of type '"food" | "commodity" | "clothe"'
工具类型
ReturnType
返回 T 的返回值类型,T 为 (…args: any) => any
typeResult = ReturnType<() =>number> // type Result = number