typescript - TS2531:检查所有备选方案时数据可能为空?
问题描述
TS 游乐场:https ://go.mpen.ca/39icg
代码:
enum ErrorType {
PARSE = 'parse',
SERVER = 'server',
NETWORK = 'network',
}
type State<TData=any> = ({
loading: true,
data: null,
error: null,
} | {
loading: false,
data: TData,
error: null,
} | {
loading: false,
data: null,
error: {
type: ErrorType
[k:string]: any
}
}) & {abort: ()=>void}
function f<T>(): State<T> {}
function main() {
const {loading,data,error} = f<{foo:string}>()
if(loading) return
if(error) return
console.log(data.foo) // Object is possibly 'null'.(2531)
}
如果loading
为假,则TState
必须有data
或error
。如果error
是假的,那么它一定有data
。
为什么 TypeScript 抱怨data
可能出现null
在这种情况下?我已经检查过loading
了error
。
解决方案
您正在将您的状态解构为多个变量。那时,TypeScript 将不再将它们一起键入。每个都单独输入。
如果你想让它起作用,你需要把它们放在一起。
function main() {
const state = f<{foo:string}>()
if(state.loading) return
if(state.error) return
console.log(state.data.foo) // no error
}
推荐阅读
- time-complexity - 如何计算此代码段的复杂度?
- azure - 如何从不同构建中的第二个存储库运行 Powershell 脚本?
- ios - SwiftUI - 放置在 NavigationView 中时 VStack 不会填满整个屏幕
- r - RS硒; 循环和下载 csv 文件
- react-native - 如何删除域数据库中的表(架构中的类)不是反应原生的?
- amazon-web-services - 由于未安装 sklearn,Docker 未构建映像
- vba - Access VBA Userfrom 打开,组合框在关闭制表位的情况下获得焦点
- javascript - 计算 ul 中 li 的数量并分配类
- sql - 如何以 sysdba 身份登录 sql * plus?
- sql - 使用 LAG 创建 ID 活动时间线