TypeScript中是否有更简洁的非undefined类型转换方式?能否简化return {something: something!}这类代码的写法?
嘿,这个问题我太有共鸣了!平时写TypeScript的时候,总觉得return {something: something!}这种写法有点啰嗦,也一直在找更简洁的方式,分享几个我常用的技巧:
一、优化对象字面量的写法
1. 先断言再用对象简写
如果你百分百确定something不会是undefined或null,可以先把变量做非空断言后赋值给同名变量,接着用TypeScript的对象简写语法,瞬间清爽很多:
function getResult(something?: string) { // 先做非空断言并赋值给同名变量 const something = something!; // 直接用对象简写 return { something }; }
要是有多个属性需要处理,这种写法的优势会更明显,不用重复写键名和断言。
2. 用类型守卫做安全检查(更推荐)
非空断言!本质是“拍胸脯告诉TS我知道这个值非空”,但万一运行时实际是undefined,很容易踩坑。更安全的方式是先加类型守卫,TS会自动帮你把变量类型窄化为非空,这时直接用对象简写就行,完全不用加断言:
function getResult(something?: string) { if (something === undefined) { throw new Error("something 参数不能为空"); // 或者返回默认值兜底: // return { something: "默认值" }; } // 这里TS已经自动推断something是非undefined的 return { something }; }
二、更简洁的非undefined类型转换方法
1. 空值合并运算符(??)+ 默认值
如果允许给变量设置默认值来规避undefined,??运算符会比断言更优雅——它只会在左侧是null或undefined时返回右侧的默认值,不会像||那样把0、空字符串这类“假值”也替换掉:
function getResult(something?: string) { const safeSomething = something ?? "默认内容"; return { safeSomething }; }
2. 明确的NonNullable类型断言
如果你确定变量非空,也可以用as NonNullable<typeof something>来转换类型,比!更直观地表达“我要移除这个类型里的null和undefined”:
function getResult(something?: string) { return { something: something as NonNullable<typeof something> }; }
3. 函数参数默认值(从根源避免undefined)
如果是函数参数的场景,直接给参数设置默认值,从根源上让变量不会出现undefined,之后写代码完全不用考虑断言的问题:
// 参数自带默认值,something永远不会是undefined function getResult(something: string = "默认值") { return { something }; }
总的来说,如果追求代码安全,优先选类型守卫或参数默认值;如果能确保变量非空,先断言再用对象简写是最简洁的写法。
内容的提问来源于stack exchange,提问作者Keisuke Nagakawa 永川 圭介
相关产品推荐
相关产品推荐

