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

TypeScript .d.ts中如何声明函数签名带可选键的对象字面量参数

正确类型声明写法

你原有的写法仅标记了第二个配置参数整体可选,但没有声明该对象内部属性的可选性,TypeScript 无法识别「仅传入部分属性的配置对象」为合法入参,正确写法如下:

内联类型写法

不需要额外定义类型,直接在参数位置标注配置对象结构,给每个内部属性加上可选标记即可:

declare function myfunc(): {
  something: (
    // err 类型可根据实际业务场景替换,比如 Error | null
    err: unknown,
    options?: {
      req?: any;
      res?: any;
      errorInfo?: any;
      query?: any;
      pathname?: string;
      extra?: any;
    }
  ) => void;
};

抽离复用类型写法

如果该配置类型需要在多处复用,可以提前抽为接口,代码可读性更高:

interface SomethingOptions {
  req?: any;
  res?: any;
  errorInfo?: any;
  query?: Record<string, any>;
  pathname?: string;
  extra?: Record<string, any>;
}

declare function myfunc(): {
  something: (err: Error | null, options?: SomethingOptions) => void;
};

语法说明

  • 不要直接在解构形参上追加可选标记,这种写法无法定义对象内部属性的可选性,必须显式给参数标注对象类型,在类型层做可选声明
  • 参数名后紧跟的 ?:标记整个配置参数本身可选,支持调用时完全不传第二个参数,直接写something(err)即可
  • 配置对象内部属性名后紧跟的 ?:标记单个属性可选,支持传入仅包含部分属性的对象,比如something(err, { pathname: '/test' })会被 TypeScript 判定为合法调用
  • 示例中的any可以根据实际业务场景替换为更精准的类型,比如req/res可以替换为对应服务端框架的请求、响应对象类型,获得更准确的类型提示。

内容的提问来源于stack exchange,提问作者Anentropic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 01:27:33