gpt4 book ai didi

typescript - 缩小 typescript 中的通用类型

转载 作者:行者123 更新时间:2023-12-04 14:48:00 26 4
gpt4 key购买 nike

typescript v4.4.4为什么在类型保护之后泛型类型没有缩小?我该如何解决?

type Data = A | B | C
type G<T extends Data> = {
type: 'a' | 'b'
data: T
}
type A = {
foo: string
}
type B = {
bar: string
}
type C = {
foobar: string
}
const isA = (item: G<Data>): item is G<A> => item.type === 'a'

const throwOnA = (item: G<Data>): G<Exclude<Data, A>> => {
if (!isA(item)) return item // Item still G<Data> instead of G<B | C>
throw Error('is A')
}

最佳答案

我认为这是因为 Typescript 无法缩小 G<Data>那样下去。它只知道 item类型为 G<Data>而不是 G<A> 类型, 但不能断定生成的泛型类型应该是 G<B | C> .我最好的猜测是它的类型解析器存在限制。

作为解决方法,您可以为相反的检查创建一个函数:

const isNotA = (item: G<Data>): item is G<Exclude<Data, A>> => item.type !== 'a' // or return !isA(item)

const throwOnA = (item: G<Data>): G<Exclude<Data, A>> => {
if (isNotA(item)) return item // Item is now G<B | C>
throw Error('is A')
}

我知道这会带走一些魔力,但这是我能想到的最好的了。

关于typescript - 缩小 typescript 中的通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69646150/

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