我正在使用一个返回类型断言的函数来告诉TypScript源明确具有或不具有media
属性.如果是SourceWithoutMedia
,则应该以一种方式处理,如果是SourceWithMedia
,则应该以不同的方式处理.
问题在于TypScript从类型判定返回假的情况中推断出什么.
我预计TypScript会推断如果isSourceWithoutMedia(source)
返回假,那么source
就是SourceWithMedia
.
它实际上推断的是,如果isSourceWithoutMedia(source)
返回假,那么source
的类型就是never
.
我在这里错过了什么?有没有方法可以让TypScript推断如果isSourceWithoutMedia(source)
返回假,那么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'.
}