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
相关产品推荐
相关产品推荐

