TypeScript模块调用报错及对象方法声明方式咨询
问题解答
问题1:TS2722错误排查
出现Cannot invoke an object which is possibly 'undefined'错误,核心原因是TypeScript无法确定MyAdapter(pool)返回的对象中foo方法一定存在,具体场景可能包括:
- AdapterType类型定义问题:你的
AdapterType接口/类型别名中,foo方法被标记为可选(比如foo?: () => Promise<any>),导致TS判定该方法可能不存在。 - MyAdapter函数返回值不确定性:函数内部存在分支逻辑,部分分支未返回符合
AdapterType的对象,或返回了undefined/null,TS推断返回类型为AdapterType | undefined。 - 类型推断偏差:若未显式指定
MyAdapter的返回类型,TS可能无法正确推断出返回值是确定的AdapterType。
解决办法
- 修正
AdapterType定义,确保foo和myFunc为必填成员,移除可选标记?:
type AdapterType = { foo: (param: BarType) => Promise<any>; myFunc: () => Promise<any>; };
- 确保
MyAdapter所有代码分支都返回符合AdapterType的对象,避免返回undefined:
export default function MyAdapter(pool: Pool): AdapterType { return { async foo(bar) { // 方法实现 }, async myFunc() { // 方法实现 } }; }
- 临时应急方案(不推荐长期使用):用非空断言
!告知TS该方法一定存在:
MyAdapter(pool).foo!(bar);
问题2:嵌套方法的声明方式名称
这种在对象字面量中直接声明方法的语法,英文称为Object Literal Method Definition,中文翻译为对象字面量方法声明语法(也常被称为“对象方法简写语法”),示例:
const obj = { async foo(bar) { // 此处即为对象字面量方法声明语法 // 方法实现 }, myFunc() { // 方法实现 } };
它是ES6引入的语法糖,替代了早期foo: function(bar) {}的写法。
内容的提问来源于stack exchange,提问作者jjunsa
相关产品推荐
相关产品推荐

