You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从函数类型的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工具类型,先获取函数的所有参数组成的元组类型,再通过索引提取目标参数的类型:

  1. 获取函数参数元组:
type PersonParams = Parameters<Person>;
// 此时 PersonParams 的类型为:
// [string, number, string, { postalCode: number; city: string; street: string; }]
  1. 提取第四个参数(索引为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:35:09