gpt4 book ai didi

typescript :尝试设置动态打字键

转载 作者:行者123 更新时间:2023-12-05 04:37:21 26 4
gpt4 key购买 nike

我正在尝试设置一个类型,我希望从对象属性解析特定类型:

interface SubjectA {
id: string
title: string
description: string | null
quantity: number
links: string[]
}

let subjectA: SubjectA = {
id: "abc",
title: "def",
description: null,
quantity: 45,
links: ["ghi", "jkl"],
}

executeProcessor(subjectA, {
processors: [
{
id: "title",
process: (should_be_infered_as_string) => {},
},
{
id: "description",
process: (should_be_infered_as_string_or_null) => {},
},
{
id: "quantity",
process: (should_be_infered_as_number) => {},
},
{
id: "links",
process: (should_be_infered_as_string_list) => {},
},
],
})

在这里,我希望将我的 process 回调参数推断为与给定 id 匹配的属性类型。

为处理器的项目制作界面并不难:

interface PropertyProcessor<T, K extends keyof T> {
id: K,
process: (value: T[K]) => void
}

但是,我正在努力输入 processors 属性本身:

interface ItemProcessor<T> {
processors: PropertyProcessor<T, what_to_put_here_?>[]
}

到目前为止,我已经使用 keyof T 代替了 what_to_put_here_?。但是我的参数现在被推断为任何可能的选项 (string | null | number | string[])。

我认为我的 PropertyProcessor 类型不应该有泛型 K,并且应该自行确定 process 参数的类型:

interface PropertyProcessor<T> {
id: keyof T,
process: (value: T[same_as_id_type]) => void
}

但我不知道该怎么做。

在此先感谢您的帮助。

Playground here

最佳答案

您可以让 typescript 通过添加一个类型参数来执行此操作,该类型参数将被推断为键的元组,然后使用映射类型将该元组映射回处理器数组:

type ProcessorMap<T, K extends Array<keyof T>> = {
[P in keyof K]: PropertyProcessor<T, K[P] & keyof T>
}

function executeProcessor<T,P extends [keyof T] | (keyof T)[]>(item: T, processor: {
processors: ProcessorMap<T, P>
}) {
}

Playground Link

约束[keyof T] | (keyof T)[] 使 P 被推断为一个元组。然后我们使用映射类型 ProcessorMap 映射回我们真正想要的元组。

关于 typescript :尝试设置动态打字键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70710028/

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