TypeScript变量test赋值前使用及类型不匹配问题咨询
TypeScript 报错修复方案
报错根源
- 第一个
Variable 'test' is used before being assigned报错:你声明了test变量但没有给初始值,就直接解构给clone使用,不符合TypeScript的变量赋值校验规则。 - 第二个类型缺失报错:
IPeople类型定义了phoneNumber、id、address等8个必填属性,直接赋值空对象{}不满足类型约束。
另外你当前的代码存在异步时序问题:getPeopleInfo是异步请求,then回调会在整个函数return之后才执行,你返回的testPeople永远是空数组,克隆赋值逻辑不会在return前生效。
推荐修复方案(优先选择)
调整函数为异步写法,直接克隆接口返回的完整IPeople对象,不需要提前声明空对象,从根源解决类型和时序问题:
export const testIt = async (): Promise<{ testPeople: IPeople[]; }> => { const personId = "Peter03"; // 等待异步接口返回完整的IPeople类型数据 const person = await getPeopleInfo(personId); // 直接解构克隆,自带所有必填属性,满足类型校验 const clone = { ...person }; const testPeople: IPeople[] = [clone]; return { testPeople }; };
兼容原有同步写法的修复方案
如果必须保留原有同步返回的逻辑,可以用Partial类型+类型断言处理:
export const testIt = (): { testPeople: IPeople[]; } => { const personId = "Peter03"; // 用Partial<IPeople>允许临时缺失属性,初始值设为空对象 let clone: Partial<IPeople> = {}; getPeopleInfo(personId) .then(person => { // 把接口返回的完整属性赋值到clone Object.assign(clone, person); }); const testPeople: IPeople[] = []; if (Object.keys(clone).length > 0) { // 确认属性填充完成后,断言为IPeople类型 testPeople.push(clone as IPeople); } return { testPeople }; };
注意:该方案仍存在异步时序问题,函数返回后
clone才会被赋值,返回的testPeople始终为空。
内容的提问来源于stack exchange,提问作者Frances
相关产品推荐
相关产品推荐

