如何让TypeScript识别带默认值的options对象属性不会为undefined
核心解决思路:你当前的写法本身存在逻辑漏洞:默认参数只会在完全不传第二个参数、或者传入undefined时才会触发,如果你传入部分属性的配置对象,未传入的属性不会被默认值填充,会直接是undefined。解决这个逻辑问题的同时就能顺便解决TS的类型推断问题,不用非空断言或者可选链,有两种常用方案:
方案1:参数解构+内联默认值(最推荐)
直接在参数位置对options做解构,给每个属性单独设置默认值,TS可以自动推断出所有属性都是非空的,不需要额外的类型判断。
代码示例:
export type Options = { onlyFirstWord?: boolean; separator?: string; }; export default function capitalize( str: string, { onlyFirstWord = false, separator = " " }: Options = {} ) { // 此处直接使用onlyFirstWord、separator即可,TS能识别二者均为非空值 }
调用时的表现和预期完全一致:可以不传第二个参数、也可以传任意缺省属性的Options对象。
方案2:显式合并配置对象
如果你想保留options对象的统一引用,不使用解构,可以先对默认配置和用户传入的配置做合并,同时给默认配置标注Required<Options>类型,TS会自动推导出合并后的配置所有属性都是必选的。
代码示例:
export type Options = { onlyFirstWord?: boolean; separator?: string; }; // 显式标注默认配置为全属性必选的Required<Options> const defaultOptions: Required<Options> = { onlyFirstWord: false, separator: " ", }; export default function capitalize( str: string, options: Options = {} ) { // 合并默认配置和用户传入的配置,用户传入的属性会覆盖默认值 const mergedOptions = { ...defaultOptions, ...options }; // mergedOptions的类型会被TS自动推导为Required<Options>,所有属性均非空 }
为什么TS无法自动识别原来的写法?
你给参数标注的类型就是属性可选的Options,TS只会遵循你显式声明的类型定义,不会因为你给参数赋了一个全属性的默认值,就自动修改参数的类型——毕竟你允许用户传入部分属性的配置对象,参数本身的类型确实是属性可选的,只有完成配置合并之后,得到的对象才是全属性非空的。
内容的提问来源于stack exchange,提问作者kalexei
相关产品推荐
相关产品推荐

