gpt4 book ai didi

typescript - 我可以使用 TypeScript 来根据对象的键强制执行对象的值吗?

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

我有以下类型:

type Filter = {
display: string
id: string
argType: 'string' | 'number' | 'date' | 'none'
}

type FilterMap = {[key: string]: Filter}

但是,在此应用程序中,FilterMap 中的每个 string 键都需要匹配相应 Filter< 的 id 属性 值。

到目前为止,我已经设法让它工作了:

type Filter<ID extends string> = {
display: string
id: ID
argType: 'string' | 'number' | 'date' | 'none'
}

type FilterMap<IDS extends string> = {[ID in IDS]: Filter<ID>}

let x: FilterMap<'foo' | 'bar'> = {
foo: {display: 'Foo', id: 'foo', argType: 'string'},
bar: {display: 'Bar', id: 'bar', argType: 'string'},
}

这将产生错误,例如,如果倒数第二行改为读取 bar: {display: 'Bar', id: 'baz', argType: 'string'},,这这就是我想要的!

有没有一种方法可以无需第三次键入所有键,因为我必须在 FilterMap 的类型参数中这样做在这里?

最佳答案

如果您利用函数的推理行为,就可以做到这一点。我们可以创建一个带有泛型参数的函数来表示字符串文字类型的联合,并让编译器找出该类型是什么,它会做什么。

type Filter<ID extends string> = {
display: string
id: ID
argType: 'string' | 'number' | 'date' | 'none'
}

type FilterMap<IDS extends string> = { [ID in IDS]: Filter<ID> }


function createFilterMap<T extends string>(fm: FilterMap<T>) {
return fm
}

// Will be of type FilterMap<"foo" | "bar">
let x = createFilterMap({
foo: { display: 'Foo', id: 'foo', argType: 'string' },
bar: { display: 'Bar', id: 'bar', argType: 'string' },
})

关于typescript - 我可以使用 TypeScript 来根据对象的键强制执行对象的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51075159/

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