如何从函数类型的Person接口中选取address参数类型?
从函数类型接口中提取参数的address类型
你定义了一个函数类型的Person接口:
interface Person { ( name: string, age: number, lang: string, address: { postalCode: number; city: string; street: string; } ): void; }
用普通接口的Pick语法提取address类型时:
type PersonAddress = Pick<Person, "address">
会触发TypeScript错误:
Type 'string' does not satisfy the constraint 'never'.ts(2344)
问题原因
Pick工具类型仅适用于对象结构的接口,用来提取对象的属性类型。但Person是函数类型接口,它本身不存在address属性——address是这个函数的第四个参数的类型,所以Pick无法直接处理。
解决方案
方式一:通过参数索引提取
利用TypeScript内置的Parameters工具类型,先获取函数的所有参数组成的元组类型,再通过索引提取目标参数的类型:
- 获取函数参数元组:
type PersonParams = Parameters<Person>; // 此时 PersonParams 的类型为: // [string, number, string, { postalCode: number; city: string; street: string; }]
- 提取第四个参数(索引为3)的类型:
type PersonAddress = PersonParams[3];
也可以合并为一行代码:
type PersonAddress = Parameters<Person>[3];
方式二:按参数名提取(不受顺序影响)
如果担心参数顺序调整导致索引失效,可以先把参数映射为对象类型,再通过属性名提取:
// 将函数参数映射为对象类型 type ParamsToObject<T extends (...args: any[]) => any> = T extends (...args: [name: infer Name, age: infer Age, lang: infer Lang, address: infer Address]) => any ? { name: Name; age: Age; lang: Lang; address: Address } : never; // 提取address类型 type PersonAddress = ParamsToObject<Person>['address'];
这种方式通过参数的名称绑定类型,即使后续参数顺序改变,只要参数名不变,就能正确提取目标类型。
内容的提问来源于stack exchange,提问作者FD3
相关产品推荐
相关产品推荐

