当类型谓词函数返回 false 时,TypeScript 会推断 never 类型

问题描述 投票:0回答:1

我正在使用一个返回类型谓词的函数来告诉 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 游乐场上的示例

typescript type-inference
1个回答
0
投票

你的问题是 TypeScript 不够智能,无法理解第一个条件块和第二个条件块之间的关系。

您应该能够通过将源显式转换为

SourceWithMedia

来解决此问题
function doSomethingWithMedia (source: SourceWithMedia | SourceWithoutMedia) {
  if (isSourceWithoutMedia(source)) return source

  const sourceWithMedia = source as SourceWithMedia
  if (sourceWithMedia.media) return sourceWithMedia.media;
}
© www.soinside.com 2019 - 2024. All rights reserved.