gpt4 book ai didi

当类型定义中使用泛型和条件时,Typescript 不会在 switch 语句中推断类型

转载 作者:行者123 更新时间:2023-12-05 01:40:26 25 4
gpt4 key购买 nike

我有一个函数的类型定义。我将第二个参数的类型定义为以第一个参数的类型为条件,如下所示:

const FOO = "FOO";
const BAR = "BAR";

let fooPayload = {
zip: "zap"
}
let barPayload = {
cat: "dog"
}

type ActionTypes = typeof FOO | typeof BAR;
interface MyFunction<T extends ActionTypes = ActionTypes> {
(
action: {
type: T;
payload: T extends typeof FOO
? typeof fooPayload
: typeof barPayload;
}
): boolean;
}

MyFunction 的函数interface 指的是其中有一个 switch 语句,它根据 action.type 进行切换。并根据情况对 action.payload 做一些事情.这是一个例子:

const myFunction:MyFunction = (action) => {
switch (action.type) {
case FOO:
action.payload.zip = "new zap"
return true
case BAR:
action.payload.cat = "new dog"
return false
default:
return false
}
}

我遇到的问题是 Typescript 没有正确推断出 action.payload 是什么应该来自 switch 语句。例如,如果 action.type等于“FOO”那么它应该推断出action.payload必须是 typeof fooPayload .相反,它推断它是 typeof fooPayload | typeof barPayload .

这作为 action.payload 的类型定义没有任何意义基于 action.type 的值, 自 action.payload.zip在 switch 语句 中被调用,该语句只能在 action.type 时发生等于“FOO”,它应该推断出 action.payload 的唯一可能类型是typeof fooPayload .

Here's a code example

我在这里做错了什么?

最佳答案

我不确定这导致问题的确切位置,但总的来说,问题是您正在尝试重新发明 typescript 已经做得很好的东西,窄类型联合。

条件是一个非常有趣的特性,但有时会表现得有点出乎意料,因为它们是分布式的,因此会超出定义的范围。

我会以不同的方式实现它:

interface Action<T, P> {
type: T,
payload: P
}

type Actions
= Action<typeof FOO, typeof FooPayload>
| Action<typeof BAR, typeof BarPayload>
;

interface MyFunction {
(action: Actions): boolean;
}

不需要条件,typescript 会在 switch 中按预期缩小并集。

关于当类型定义中使用泛型和条件时,Typescript 不会在 switch 语句中推断类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56624326/

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