gpt4 book ai didi

javascript - 根据 Typescript 中输入对象的属性,使用键从函数返回对象

转载 作者:行者123 更新时间:2023-11-30 19:11:02 24 4
gpt4 key购买 nike

我正在尝试创建一个函数来接收具有特定属性的对象,然后使用其中一个属性来生成结果的类型。

函数参数

interface Params<T> {
entries?: { [key in T['entries']: string]: number }
unit?: string
}

结果

type Result<T> = { [key in T: string]: string }

结果中的 T 是 Params['entries']

我设置了一个简单的 typescript playground显示我的尝试。

目前,如果您键入 result.,它只会建议默认值 big|small,而不是 a实际对象输入。

最佳答案

问题就出在这里

generateUnitStrings = <O>(options?: Params<O>) // ---> the <O>

什么是奥?这就是为什么 PickEntries<O> extends never返回真。一种检查方法是这样做

const result = generateUnitStrings<{ entries: { a: number } }>({ entries: { a: 1 } })

您会发现它确实有效。自动完成正确地建议“a”。原因是当你调用 generateUnitStrings , O正确切换为 { entries: { a: number } }并将其传递给 Params,一切正常。

试试这个(对我来说它看起来有点奇怪,但它确实有效!):

export const generateUnitStrings = <O extends Params<O>>(options?: O) => {
...

编辑

Yes, but now your solution only suggests something if generateUnitStrings() has parameters, if it used empty as generateUnitStrings() it doesn't auto-suggests the default parameters small|big

提供默认泛型类型(在本例中为 typeof defaultParams)似乎可以完成工作

export const generateUnitStrings = <O extends Params<O> = typeof defaultParams>(options?: O) => {
const entries = (options && options.entries) || defaultParams.entries
const unit = (options && options.unit) || defaultParams.unit

return Object.keys(entries).reduce(
(acc, v) => ({ ...acc, [v]: `${entries[v as keyof typeof entries]}${unit}` }),
{}
) as PickEntries<O> extends never ? Result<PickEntries<typeof defaultParams>> : Result<PickEntries<O>>
}

Playground

您的初始代码供引用

type FilterProperties<T, P> = {
[K in keyof T]: K extends P ? K : never
}[keyof T]
type PickEntries<T> = T[FilterProperties<T, 'entries'>]

interface Params<T> {
entries?: { [K in keyof PickEntries<T>]: number }
unit?: string
}

type Result<T> = { [P in keyof T]: string }

export const defaultParams = {
entries: {
small: 600,
big: 1200,
},
unit: 'px',
}

export const generateUnitStrings = <O>(options?: Params<O>) => {
const entries = (options && options.entries) || defaultParams.entries
const unit = (options && options.unit) || defaultParams.unit

return Object.keys(entries).reduce(
(acc, v) => ({ ...acc, [v]: `${entries[v as keyof typeof entries]}${unit}` }),
{}
) as PickEntries<O> extends never ? Result<PickEntries<typeof defaultParams>> : Result<PickEntries<O>>
}

const result = generateUnitStrings({ entries: { a: 1 } })

关于javascript - 根据 Typescript 中输入对象的属性,使用键从函数返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58473794/

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