如何让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
相关产品推荐
相关产品推荐

