unde-6ren">
gpt4 book ai didi

TypeScript 扩展关键字搞乱了类型推断

转载 作者:搜寻专家 更新时间:2023-10-30 21:35:10 24 4
gpt4 key购买 nike

为什么下面的 TypeScript 代码无效?

type A = { kind: "a" }
type B = { kind: "b" }

const a = (a: A): void => undefined
const b = (b: B): void => undefined

const c = <C extends A | B>(c: C): void => (c.kind == "a" ? a(c) : b(c))

看起来 TypeScript 无法确定在 c.kind == "a" 之后,c 是一个 A。为什么不呢?

以下变体似乎有效。

type A = { kind: "a" }
type B = { kind: "b" }
type C = A | B

const a = (a: A): void => undefined
const b = (b: B): void => undefined

const c = (c: C): void => (c.kind == "a" ? a(c) : b(c))

最佳答案

类型保护将作用于联合类型的参数,它不会作用于扩展联合的泛型类型参数。这记录在此 issue 中.这个问题是开放的,可能会在以后得到解决。

这个问题的一个可能的解决方法是使用您的非通用版本,对于您的简单示例,它的工作原理是一样的。

如果你的签名更复杂并且你在其他一些能力中使用泛型类型(例如在某些条件类型中,或者在其他参数或参数与返回类型之间创建关系)你可以使用具有多个签名的函数,公共(public)通用签名和非通用实现签名:

function c<C extends A | B>(c: C): void
function c(c: A | B): void {
return c.kind == "a" ? a(c) : b(c);
}

Playground link

关于TypeScript 扩展关键字搞乱了类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52383220/

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