gpt4 book ai didi

TypeScript Exclude 是类型 "never"

转载 作者:行者123 更新时间:2023-12-03 19:07:35 25 4
gpt4 key购买 nike

为什么下面的代码是Exclude<A,B>解析到 never类型? typescript 编译器不能知道(通过静态分析)AB延长 Parent因此 Exclude<Choices, Parent>应该解析为类型 C ?

interface Parent {}

interface A extends Parent {}
interface B extends Parent {}
interface C {}

type Choices = A | B | C

type Test = Exclude<Choices, Parent> // = type "never"???

const c: C = {}
const d: Test = c // Type 'C' is not assignable to type 'never'
我可以硬编码 Parent = A | B但我不确定为什么我需要这样做。

最佳答案

这是因为 TypeScript 有鸭子类型。具体来说,由于 CParent都是一样的界面,C可分配给 Parent .
具体来说,这编译:

const c: C = {};
const p: Parent = c;
所以,虽然 C没有明确 extend Parent , TypeScript 还是说 CParent .
如果你想让这个工作,只需添加一些东西到 Parent那个 C没有。
interface Parent { foo: string }

interface A extends Parent {}
interface B extends Parent {}
interface C {}

type Choices = A | B | C

type Test = Exclude<Choices, Parent> // = type C

const c: C = {}
const d: Test = c // works!

关于TypeScript Exclude<UnionOfTypes, Interface> 是类型 "never",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63185800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com