TypeScript解构赋值报错:类型与属性名不匹配问题咨询
TypeScript解构赋值报错:类型与属性名不匹配的问题解析
嘿,我来帮你理清楚这个报错的根源和解决办法~
问题原因
你遇到的报错核心是解构赋值的属性名、类型注解和函数参数的实际类型完全不匹配:
- 函数
keepWholeObject的参数obj_param被定义为{x: string, y:number},这意味着传入的对象必须包含x和y两个属性; - 但你在解构时写的是
let {a, b}:{a: string, b: number} = obj_param,这里试图从obj_param里提取名为a和b的属性——可obj_param根本没有这两个属性啊!TypeScript的严格类型检查自然会抛出错误,提示{x: string, y: number}类型中不存在a、b属性。
解决办法
根据你的实际需求,有两种常见的修复方式:
需求1:想提取参数里的x和y,只是想重命名为a和b
如果是笔误,你其实是想把参数的x、y属性拿出来,只是想用a、b作为变量名,那可以用解构重命名的写法:
function keepWholeObject(obj_param: {x: string, y:number}){ // 用 x:a 表示把obj_param.x赋值给变量a,y同理 const {x: a, y: b} = obj_param; console.log(`In function - ${a}`); // 会输出obj_param.x的值 console.log(`In function - ${b}`); // 会输出obj_param.y的值 }
要是你非要手动加类型注解(其实TS会自动推导),可以这么写:
function keepWholeObject(obj_param: {x: string, y:number}){ const {x: a, y: b}: {x: string, y: number} = obj_param; console.log(`In function - ${a}`); console.log(`In function - ${b}`); }
需求2:函数本来就该接收你定义的t类型对象
如果你的本意是让这个函数处理开头声明的obj(类型为t),那就要修正函数的参数类型,让它和t匹配:
interface t { a: string, b: number, c: string } let obj: t = { a: "foo", b: 12, c: "bar" }; // 把参数类型改为t,解构时直接取a和b function keepWholeObject(obj_param: t){ const {a, b} = obj_param; // TS会自动识别a是string,b是number console.log(`In function - ${a}`); // 输出"foo" console.log(`In function - ${b}`); // 输出12 } // 调用函数 keepWholeObject(obj);
更简洁的写法是直接在参数位置解构:
function keepWholeObject({a, b}: t){ console.log(`In function - ${a}`); console.log(`In function - ${b}`); }
内容的提问来源于stack exchange,提问作者overexchange
相关产品推荐
相关产品推荐

