Extract
是 TypeScript 中非常有用的一个类型工具,它可以从一个类型中提取出符合条件的子类型。本文将详细介绍 Extract
的使用方法,并通过示例代码来说明其深度和学习指导意义。
Extract 的基本用法
在类型系统中,我们经常需要筛选出符合某个条件的类型,这时可以使用 Extract
工具。Extract
的定义如下:
type Extract<T, U> = T extends U ? T : never;
其中,T
是需要进行筛选的类型,U
是筛选条件。Extract
基本的使用方法是将需要筛选的类型和筛选条件传递给 Extract
工具,例如:
type MyType = string | number | boolean; type ExtractedType = Extract<MyType, string>;
在上面的例子中,MyType
是一个由 string
、number
和 boolean
构成的联合类型,Extract
工具的第一个参数是 MyType
,第二个参数是 string
,所以 Extract
工具的返回值类型是 string
。这样,就将 MyType
中的 string
类型提取出来了。
Extract 的高级用法
Extract
工具不仅可以用于基本类型的筛选,还可以用于对象的筛选。例如,我们定义了一个包含多个属性的对象类型:
type MyObj = { name: string; age: number; height: number; };
我们希望从 MyObj
中提取出 age
和 height
属性的类型,可以这样写:
type ExtractedObj = Pick<MyObj, Extract<keyof MyObj, 'age' | 'height'>>;
在上面的代码中,keyof MyObj
表示 MyObj
的键集合,即 'name' | 'age' | 'height'
。'age' | 'height'
表示我们希望提取的属性名集合。Extract
工具的返回值是 'age' | 'height'
,即我们要提取的属性名集合。Pick
工具根据属性名集合从 MyObj
中选出对应的属性并构成一个新的类型。
Extract
工具还可以用于条件类型的定义。例如,我们定义一个条件类型 MyType<T>
,其中 T
是一个联合类型:
type MyType<T> = T extends string ? string : number;
我们希望将 MyType
中 string
类型的子类型提取出来,可以这样写:
type ExtractedType<T> = Extract<T, string>;
在上面的代码中,Extract
工具的第一个参数是 T
,表示需要提取的类型。第二个参数是 string
,设置了筛选条件。这样,ExtractedType
类型就是 T
中 string
类型的子类型。
示例代码
下面是一个很常见的场景,我们需要对一个对象类型的键值对进行类型转换,将其中的字符串值转换为数字值:
-- -------------------- ---- ------- ---- ----- - - ----- ------- ---- ------- ------- ------- -- ---- ------ - - ----- ------- ---- ------- ------- ------- --展开代码
我们可以这样实现:
-- -------------------- ---- ------- ---- ----- - - ----- ------- ---- ------- ------- ------- -- ---- ------ - - ----- ------- ---- ------- ------- ------- -- ---- ------------ - - -- -- ----- --- ---- ------- ------ - ------ - ----- -- ---- ------ - -----------------展开代码
在上面的代码中,我们定义了一个转换类型 Converted
,它用于将键值对中的字符串值转换为数字值。[K in keyof T]
表示遍历 T
对象的键集合,T[K]
表示键 K
对应的值。T[K] extends string ? number : T[K]
表示若值为字符串,则将其转换为数字,否则不变。最后,Result
类型就是 Input
转换后的类型。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67ceca44e46428fe9e9743da