TypeScript嵌套参数默认值设置后变量无法访问如何解决
问题原因
你的代码有两个核心问题,导致变量无法访问:
- 构造函数名拼写错误:TS/JS里类的构造函数固定名称是
constructor,你写的construction只是类的普通实例方法,不会在类实例化时自动执行。 - 对对象解构的语法规则理解有误:
{ config: { baz = 1 } }这种嵌套解构写法,config只是解构路径上的中间属性名,不会被绑定为当前作用域的可访问变量,只有内层的baz会被声明为变量;同时如果传入参数里的config是undefined,直接解构内层属性会直接抛出运行时错误。
正确写法
要同时访问config和带默认值的baz,你需要显式绑定外层的config变量,同时按需给可能为空的外层属性设置默认值,参考代码如下:
export type Bar = { baz: number }; // 如果允许实例化时不传config字段,把属性标记为可选 export type FooConstructorArguments = { config?: Bar }; class Foo { constructor({ // 显式绑定config变量,同时给config设置默认值,避免config不存在时解构内层报错 config = {} as Bar, // 从config上解构baz,设置默认值为1 config: { baz = 1 } }: FooConstructorArguments) { let c = config; // 正常访问config对象 let b = baz; // 正常访问baz,未传值时默认取1 } }
补充说明
- 对象解构中,冒号的作用是标记下一层的解构路径,只有写在冒号左侧、且没有被后续冒号接续的标识符,才会被绑定为当前作用域的变量。如果要同时拿到外层属性和内层属性,需要像示例中一样,先单独写
config完成变量绑定,再写config: { baz = 1 }完成内层属性的解构和默认值设置。 - 如果你的业务逻辑要求
config必须传入,不允许为空,可以去掉config的默认值,同时把类型里的可选标记?删掉,此时TS会在类型校验阶段强制要求传入合法的config对象,避免解构报错。
内容的提问来源于stack exchange,提问作者CoryG
相关产品推荐
相关产品推荐

