function identity<T>(value: T): T {
return value
}
const n = identity<number>(42)
const s = identity('hello') // 类型推断为 string
二、泛型约束
TypeScript
interface HasLength {
length: number
}
function logLength<T extends HasLength>(arg: T): number {
return arg.length
}
logLength('abc') // ✅
logLength([1,2,3]) // ✅
logLength(123) // ❌ number 没有 length
三、keyof 与索引访问
TypeScript
interface User {
id: number
name: string
email: string
}
type UserKeys = keyof User // 'id' | 'name' | 'email'
type NameType = User['name'] // string
四、条件类型
TypeScript
type IsString<T> = T extends string ? true : false
type A = IsString<'abc'> // true
type B = IsString<123> // false// 实用:提取数组元素类型
type Flatten<T> = T extends Array<infer Item> ? Item : T
type C = Flatten<string[]> // string
type D = Flatten<number> // number
五、infer 的高级用法
TypeScript
// 获取函数返回类型
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any
// 获取 Promise 结果类型
type Awaited<T> = T extends Promise<infer U> ? U : T
// 获取函数第一个参数
type FirstArg<T> = T extends (first: infer F, ...rest: any[]) => any ? F : never
六、映射类型
TypeScript
// 全部可选
type Partial<T> = {
[P in keyof T]?: T[P]
}
// 全部只读
type Readonly<T> = {
readonly [P in keyof T]: T[P]
}
// 自定义:全部变为 string
type Stringify<T> = {
[P in keyof T]: string
}
// 加修饰符(移除可选/只读)
type Mutable<T> = {
-readonly [P in keyof T]-?: T[P]
}
评论(0)
还没有评论,来说两句吧