TypeScript如何设置可选属性且保证其不会为undefined类型
解决方案
以下两种方案均满足需求:调用方无需传入可选属性,函数内部补全属性后TS可自动识别属性为非undefined类型。
方法1:参数解构+默认值(单属性使用场景首选)
如果仅需要用到可选属性本身,直接在解构时给属性赋值默认值即可,TS会自动将该属性推导为非undefined类型,无需额外类型声明:
interface X { a?: string } function stringValue(value: string):void{} function test(x: X){ // 解构时给a设置默认值,a的类型自动推导为string const { a = "string value" } = x stringValue(a) // 无类型错误 }
该写法简洁无冗余,完全符合TS原生类型推导规则。
方法2:使用Required<T>工具类型标记补全对象(完整对象使用场景首选)
如果需要使用补全属性后的完整对象,可以借助TS内置的Required<T>工具类型,它的作用是将泛型T的所有可选属性转为必选,自动排除undefined类型:
function test(x: X){ // 展开原对象并补全可选属性,赋值给类型为Required<X>的变量 const filledX: Required<X> = { ...x, a: "string value" } stringValue(filledX.a) // 无类型错误 }
该写法不会修改传入的原参数对象,副作用更小,适合需要传递完整补全对象的场景。
原写法报错原因
你之前的写法报错是因为变量x的类型在函数参数声明时就已经固定为X,TS不会因为后续给x赋值了带必选属性的对象,就自动修改x的原始类型声明,因此需要通过上述方式主动告知TS属性已被补全。
内容的提问来源于stack exchange,提问作者Sherif eldeeb
相关产品推荐
相关产品推荐

