TypeScript默认参数引发编译错误,请求排查代码问题
问题分析与解决
你的代码编译错误的核心原因是:在对象字面量初始化betterUser的过程中,betterUser变量还未完成赋值,此时在greet方法的默认参数里引用betterUser.name属于“在变量初始化前访问”。
TypeScript的变量初始化检测机制会拦截这种操作——当JavaScript执行到greet函数的默认参数定义时,betterUser还只是一个未完全初始化的变量(对象字面量仍在构建中,还没把引用赋值给betterUser),所以无法访问它的name属性。
修复方案
有两种常见的修复方式:
1. 利用this获取当前对象的name(推荐)
把greet改成普通函数(箭头函数的this不会绑定到当前对象),通过this.name作为默认参数,同时调整类型定义支持无参调用:
type User = { readonly id: number, name: string, greet: (name?: string) => void // 将参数设为可选,允许无参调用 } let betterUser: User = { id: 2, name: 'Masud', greet: function(name: string = this.name): void { console.log(`Hello ${name}`) } } betterUser.greet(); // 正常输出 "Hello Masud"
2. 先提取name变量,再用作默认值
如果坚持使用箭头函数,可以先把name单独定义,再在默认参数里引用:
type User = { readonly id: number, name: string, greet: (name?: string) => void } const userName = 'Masud'; let betterUser: User = { id: 2, name: userName, greet: (name: string = userName): void => { console.log(`Hello ${name}`) } } betterUser.greet(); // 正常输出 "Hello Masud"
内容的提问来源于stack exchange,提问作者Masudur Rahman
相关产品推荐
相关产品推荐

