如何解决为什么 typescript typeguard 对对象的内部属性不起作用
使用打字稿,当函数返回具有可能为 null 的属性的对象时。为什么在这些内部属性上使用 typeguard 不允许 typescript 推断内部 prop 在保护之后不能为 null?
interface DatabaseResponse {
settings: string | null
}
interface MainResponse {
settings: string
}
const retrieveFromDatabase = (): DatabaseResponse => {
return {
settings: 'always a string but lets pretend it Could be null sometimes'
}
}
const main = (): MainResponse | Error => {
const data = retrieveFromDatabase()
if (data.settings === null) {
throw new Error()
}
return data
}
Type 'DatabaseResponse' is not assignable to type 'MainResponse | Error'.
Type 'DatabaseResponse' is not assignable to type 'MainResponse'.
Types of property 'settings' are incompatible.
Type 'string | null' is not assignable to type 'string'.
Type 'null' is not assignable to type 'string'.
解决方法
那不是真正的类型保护。你可以这样做:
interface DatabaseResponse {
settings: string | null
}
interface MainResponse {
settings: string
}
const retrieveFromDatabase = (): DatabaseResponse => {
return {
settings: 'always a string but lets pretend it could be null sometimes'
} as DatabaseResponse
}
const main = (): MainResponse | Error => {
const data = retrieveFromDatabase()
if (!isMainResponse(data)) {
throw new Error()
}
return data
}
const isMainResponse = (data: DatabaseResponse | MainResponse): data is MainResponse {
return !!data.settings;
}
或者类似地,创建一个具有相同 typeguard 的新的 nonNullable 类型
type NonNullableDB = { [K in keyof DatabaseResponse]: NonNullable<DatabaseResponse[K]> }
const isMainResponse = (data: DatabaseResponse | MainResponse): data is NonNullableDB => {
return !!data.settings;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。