网站搜索

typescript - 在 TypeScript 4.7.3 中使用类型谓词无法返回正确的类型


在以下示例中,我使用了一个用户定义的类型保护函数来过滤数组。我想要一个仅包含 Fish 的强类型数组。

类型在这里被正确返回,请注意我正在使用无点风格:

const onlyFish = animals.filter(isFish); // Fish[]

这里类型没有正确返回,它是一个混合数组:

const onlyFish2 = animals.filter(x => isFish(x)); // (Fish | Bird)[]
  • 为什么会有这种不同?
  • 如何在不使用 const onlyFish2: Fish[] 的情况下确保 onlyFish2 中的类型正确返回

TS 游乐场

    type Fish = {
        variant: 'fish'
    }
    
    type Bird = {
        variant: 'bird'
    }
    
    const isFish = (animal: Fish | Bird): animal is Fish => animal.variant === 'fish';
    
    const animals: ReadonlyArray<Fish | Bird> = [{ variant: 'fish' }, { variant: 'bird' }];
    
    const onlyFish = animals.filter(isFish); // Fish[]
    
    const onlyFish2 = animals.filter(x => isFish(x)); // (Fish | Bird)[]

答案#1

区别如下:

const onlyFish = animals.filter(isFish);

在这里,谓词的结果将是 x is Fish,因此 TypeScript 可以正确地推断出类型。

然而,在这种情况下:

const onlyFish2 = animals.filter(x => isFish(x));

你的谓词的返回值是一个 boolean,因为你正在从你的类型保护中返回结果:“x 是鱼吗?”。