解构移除对象属性遇TS(18004)错误,能否单行实现sanitize?
单行解构移除对象属性的TS错误解决
错误原因
你碰到的TypeScript错误 No value exists in scope for the shorthand property 'something'. Either declare one or provide an initializer.ts(18004),本质是因为你在逻辑与(&&)的表达式上下文里做解构赋值,TS无法正确识别rest的作用域——这种写法里的解构没有在块级或函数作用域内声明变量,导致TS判定rest未定义。
可行的单行内联写法
不用单独定义sanitize函数,直接用立即执行箭头函数就能实现单行需求,同时规避作用域问题:
JSON.stringify((({ apikey, password, ...rest }) => rest)(data))
逻辑说明
把解构操作放到箭头函数的参数列表中,函数隐式返回rest,紧接着传入data执行这个箭头函数。这样TS能清晰识别rest是解构生成的变量,不会再抛出作用域相关的错误。
如果偏好更贴近原写法的结构,也可以写成带块级作用域的立即执行函数(但箭头函数的隐式返回更简洁):
JSON.stringify(((data) => { const { apikey, password, ...rest } = data; return rest; })(data))
原写法无法直接修复的原因
你最初的({ apikey, password, ...rest } = data) && rest写法,没法通过添加初始化器或声明来解决问题。因为TS在表达式语境中不会将解构赋值的变量提升到当前作用域,这是TS作用域规则的限制,换用箭头函数的写法是更合规的解决方案。
内容的提问来源于stack exchange,提问作者Karl Newgrove
相关产品推荐
相关产品推荐

