gpt4 book ai didi

typescript - 为什么使用条件运算符会导致交集类型?

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

我正在尝试创建一个通用函数,该函数根据其参数的类型有条件地返回值,但我一直在尝试实现返回类型。

假设有一个类型 Basket

type Basket = {
Fruit: 'banana',
Veggie: 'tomato'
}

现在,如果我想根据传递给函数的参数有条件地返回“banana”或“tomato”,我将无法编译它:

const f1 = <T extends keyof Basket>(t: T): T extends 'Fruit'? 'banana': 'tomato' => {
if (t == 'Fruit') {
return 'banana' //Error on this line - doesn't compile -- Type '"banana"' is not assignable to type '"banana" & "tomato"
} else {
return 'tomato' //Error on this line - doesn't compile -- Type '"tomato"' is not assignable to type '"banana" & "tomato"
}
}

现在,当我在传递正确的泛型参数后实例化它时,我得到了我期望的类型,但它没有编译

const doesntCompile: 'banana' = f1<'Fruit'>('') //type: 'banana', which is what I want ... but this doesn't compile due to the error above.

但是,如果我不使用泛型,我会得到这样的求和类型

//This compiles
const f2 = <T extends keyof Basket>(t: string): Basket[keyof Basket] => { //return type is 'banana' | 'tomato'
if (t == 'yellow') {
return 'banana'
} else {
return 'tomato'
}
}
const complies: 'banana' | 'tomato' = f2<'Fruit'>('') //type: 'banana' | 'tomato', but I want the type here to be 'banana'

现在它编译得很好,但我失去了类型安全的好处。

如何在保留泛型的同时让这个示例工作?非常感谢任何帮助。

最佳答案

关于您的问题,它来自延迟的条件类型。查看 typescript 文档:https://www.typescriptlang.org/docs/handbook/advanced-types.html#conditional-types . (延迟搜索条件类型以到达页面中的正确位置)。

最简单的解决方案是使用更宽松的单独实现签名,同时使用对调用者更好的条件类型保留公共(public)签名:

type Basket = {
Fruit: 'banana',
Veggie: 'tomato'
}

function f3 <T extends keyof Basket>(t: T): Basket[T];
function f3 <T extends keyof Basket>(t: string): Basket[keyof Basket] {
if (t == 'Fruit') {
return 'banana'
} else {
return 'tomato'
}
}

const complies2 = f3('Fruit'); // complies2 is "banana"

注意:箭头函数不适用于函数重载。

关于typescript - 为什么使用条件运算符会导致交集类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57784174/

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