我正在使用一个返回类型谓词的函数来告诉 TypeScript 源明确具有或不具有
media
属性。如果是 SourceWithoutMedia
,则应以一种方式处理,如果是 SourceWithMedia
,则应以不同的方式处理。
问题在于 TypeScript 从类型谓词返回 false 的情况中推断出什么。
我希望 TypeScript 能够推断出,如果
isSourceWithoutMedia(source)
返回 false,则 source
是 SourceWithMedia
。
它实际上推断的是,如果
isSourceWithoutMedia(source)
返回 false,则 source
的类型为 never
。
我在这里缺少什么,有没有办法让 TypeScript 推断如果
isSourceWithoutMedia(source)
返回 false,那么 source
是 SourceWithMedia
?
interface SourceWithMedia {
id: string
someOtherProperty: string
media?: string
}
interface SourceWithoutMedia {
id: string
}
const isSourceWithoutMedia = (source: SourceWithMedia | SourceWithoutMedia): source is SourceWithoutMedia => {
return Object.keys(source).length === 1
}
function doSomethingWithMedia (source: SourceWithMedia | SourceWithoutMedia) {
if (isSourceWithoutMedia(source)) return source
if (source.media) return source.media // Error: Property 'media' does not exist on type 'never'.
}
你的问题是 TypeScript 不够智能,无法理解第一个条件块和第二个条件块之间的关系。
您应该能够通过将源显式转换为
SourceWithMedia
来解决此问题
function doSomethingWithMedia (source: SourceWithMedia | SourceWithoutMedia) {
if (isSourceWithoutMedia(source)) return source
const sourceWithMedia = source as SourceWithMedia
if (sourceWithMedia.media) return sourceWithMedia.media;
}