reactjs - 有没有办法在打字稿中描述反应生命周期方法?
问题描述
我有时有一个看起来像这样的 React 组件:
interface IExternalDataSource {
fetch(): Promise<unknown>
free(): void
}
function getSource(): IExternalDataSource {
// some logic with side-effects
}
class Foo extends React.Component {
private source: IExternalDataSource | null = null;
componentDidMount(): void {
this.source = getSource();
this.source.fetch().then(
(value) => this.setState({ /* ... */ })
);
}
componentWillUnmount(): void {
this.source.free();
}
// ...
}
TS2531: Object is possibly 'null'
从 TS: in的角度来看,上面的代码被破坏了componentWillUnmount()
。
但是 React 组件在挂载之前不能被卸载。所以实际上this.source
永远不会null
在componentWillUnmount()
。
我可以用 TS 术语表达这个不变量吗?我知道我可以写(this.source as IExternalDataSource)
,但这很难看。
谢谢你。
解决方案
没有办法在方法中表达对象的状态。字段类型适用于所有方法。您只能执行额外的冗余检查,或使用非空断言
componentWillUnmount(): void {
this.source!.free();
}
推荐阅读
- node.js - 序列化模型 node.js 中的关联
- git - 通过 Intellij Idea UI 的 Git 命令显示以下错误:.git/hooks/prepare-commit-msg: line 32: node: command not found
- pandas - 从具有大量标签的 Pandas 数据框中创建 TensorFlow 数据集?
- javascript - 创建一个列,每当来自其他 div 的 img 发生更改时,该列就会滚动
- c# - 尝试访问 DataContext 时出现 System.ObjectDisposedException
- spring-boot - 在 @SpringBootTest 中设置类时,骆驼 @MockEndpoints 停止工作
- kubernetes - Kubernetes - 显示命令帮助,但仅显示示例
- azure - 在 Azure 和 MailNickname 中创建安全组
- node.js - 如何更新 mongo 上的许多文档并返回更新后的文档?
- c# - 为什么我听不到来自其他订户 SIP 的声音?