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 是鱼吗?”。
