You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让TypeScript编译器识别运行时动态创建的类方法?

TypeScript:告知编译器运行时创建方法的最佳实践

你需要让TypeScript编译器认可onTodoListChanged是类的属性,只是在运行时通过bindTodoListChanged方法完成赋值。以下是无需修改tsconfig.json的可行方案:

方案1:声明可选属性(推荐,更安全)

在TodoModel类中明确将onTodoListChanged声明为可选函数类型,同时调用时用可选链避免运行时调用undefined的风险:

interface Todo { /* ... */ }

export class TodoModel {
  todos: Todo[] = [];
  // 声明可选的回调属性
  onTodoListChanged?: (todos: Todo[]) => void;
 
  constructor() {
    // ...
  }

  bindTodoListChanged(callback: (todos: Todo[]) => void) {
    this.onTodoListChanged = callback;
  }

  _save(todos: Todo[]) {
    // 可选链调用:仅当方法存在时执行
    this.onTodoListChanged?.(todos);
    localStorage.setItem('todos', JSON.stringify(todos));
  }
}

方案2:用非空断言确保属性会被初始化

如果能保证bindTodoListChanged一定会在_save调用前执行,可以用!断言属性会在运行时被初始化,满足严格初始化检查的要求:

interface Todo { /* ... */ }

export class TodoModel {
  todos: Todo[] = [];
  // 断言该属性会在运行时完成初始化
  onTodoListChanged!: (todos: Todo[]) => void;
 
  constructor() {
    // ...
  }

  bindTodoListChanged(callback: (todos: Todo[]) => void) {
    this.onTodoListChanged = callback;
  }

  _save(todos: Todo[]) {
    this.onTodoListChanged(todos);
    localStorage.setItem('todos', JSON.stringify(todos));
  }
}

你之前尝试无效的原因

  • 直接用非空断言this.onTodoListChanged! = callback:未在类中声明该属性,TypeScript无法识别其存在,因此报错。
  • 仅写方法签名onTodoListChanged(todos: Todo[]): void:这是声明抽象方法签名,但未定义为类属性,TypeScript会要求你实现该方法,因此报错“Function implementation name must be 'onTodoListChanged'”。

内容的提问来源于stack exchange,提问作者Preston Bourne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:23:28