gpt4 book ai didi

TypeScript 递归条件映射类型

转载 作者:行者123 更新时间:2023-12-04 01:50:17 25 4
gpt4 key购买 nike

我需要测试多个 HTMLInputElement 的每个值s 使用一个/一些测试函数,并为每个自动生成一个嵌套的复选框列表,条件表示为 Conditions以下:

type TestFunction = (value: string) => boolean
type TestFunctionObject = { [description: string]: Conditions }
type Conditions = TestFunction | TestFunctionObject

因此,例如,如果我有:
const conds1: Conditions = {
"Consists of alphanumerics": /^[a-zA-Z0-9]$/.test
}

我得到一个标记为“由字母数字组成”的复选框。而如果:
const conds2: Conditions = /^[a-zA-Z0-9]$/.test

我不想要一个复选框,而只是用它进行验证。

自动生成没有任何问题。然后,我写了一个类型,代表每个 TestFunction 的有效性。 :
type Validity<C extends Conditions> = C extends TestFunction
? boolean
: { [K in keyof C]: Validity<C[K]> }

现在我在 C[K] 上收到来自 TS 的错误消息; playground here .它说 Type 'Conditions[K]' is not assignable to type 'TestFunctionObject' .类型调节似乎没有缩小 Conditions只是 TestFunctionObject .

我怎样才能让它工作?

添加 jcalz's answer : Playground with examples

最佳答案

我认为编译器在条件类型的 else 子句中(在 : 之后)并没有像通过控制流分析处理值那样进行大量缩小。因此,虽然在条件类型 C extends TestFunction 中对您来说很明显, C在 else 子句中应该扩展 TestFunctionObject ,编译器没有意识到。

但是编译器确实在 then 子句中进行了缩小(在 ?: 之间),因此最简单的解决方法是添加另一个条件类型:

type Validity<C extends Conditions> = C extends TestFunction ? boolean
: C extends TestFunctionObject ? { [K in keyof C]: Validity<C[K]> } : never

注意最后一个条件类型有 never作为 else 子句。这是条件类型的常见习语;有时你知道 else 子句无法到达;如果没有 invalid type , never type 是一个不错的选择。

或者,由于您开始时没有对 then 子句做太多事情,请翻转原始检查的子句:
type Validity<C extends Conditions> = C extends TestFunctionObject ?
{ [K in keyof C]: Validity<C[K]> } : boolean

要么应该工作。希望有所帮助;祝你好运!

关于TypeScript 递归条件映射类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53473712/

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