Javascript 根据Typescript中输入对象的属性,使用键从函数返回对象
我试图创建一个函数,它接收具有特定属性的对象,然后使用其中一个属性来生成结果的类型 函数参数Javascript 根据Typescript中输入对象的属性,使用键从函数返回对象,javascript,typescript,Javascript,Typescript,我试图创建一个函数,它接收具有特定属性的对象,然后使用其中一个属性来生成结果的类型 函数参数 接口参数{ 条目?:{[输入T['entries']:字符串]:数字} 单位:字符串 } 结果呢 type Result={[key in T:string]:string} 其中,结果中的T是Params['entries'] 我设置了一个简单的窗口来显示我的尝试 目前,如果您键入结果。它只会建议默认值大|小,而不是实际对象输入的a。问题就在这里 generateUnitStrings = <
接口参数{
条目?:{[输入T['entries']:字符串]:数字}
单位:字符串
}
结果呢
type Result={[key in T:string]:string}
其中,结果中的T是Params['entries']
我设置了一个简单的窗口来显示我的尝试
目前,如果您键入结果。
它只会建议默认值大|小
,而不是实际对象输入的a
。问题就在这里
generateUnitStrings = <O>(options?: Params<O>) // ---> the <O>
编辑
是的,但现在您的解决方案仅在generateUnitStrings()具有参数时才建议某些内容,如果将空用作generateUnitStrings(),则不会自动建议默认参数小而大 提供默认泛型类型(在本例中为typeofdefaultparams)似乎可以完成任务
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>>
}
export const generateUnitStrings=(选项?:O)=>{
const entries=(options&&options.entries)| | defaultParams.entries
常量单位=(选项和选项.unit)| |默认参数.unit
返回对象。键(条目)。减少(
(acc,v)=>({…acc,[v]:`${entries[v as keyof typeof entries]}${unit}}),
{}
)当PickEntries从不扩展时?结果:结果
}
您的初始代码以供参考
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 } })
类型过滤器属性={
[K in keyof T]:K扩展了P?K:永远不会
}[keyof T]
类型PickEntries=T[FilterProperties]
接口参数{
条目?:{[K in keyof PickEntries]:number}
单位:字符串
}
类型结果={[P in keyof T]:string}
导出常量defaultParams={
参赛作品:{
小型:600,,
大:1200,
},
单位:px,
}
导出常量GenerateUnitString=(选项?:参数)=>{
const entries=(options&&options.entries)| | defaultParams.entries
常量单位=(选项和选项.unit)| |默认参数.unit
返回对象。键(条目)。减少(
(acc,v)=>({…acc,[v]:`${entries[v as keyof typeof entries]}${unit}}),
{}
)当PickEntries从不扩展时?结果:结果
}
const result=generateUnitStrings({entries:{a:1}})
是的,但现在您的解决方案仅在generateUnitStrings()
具有参数的情况下提供建议,如果它作为generateUnitStrings()使用为空
它不会自动建议默认参数small | big
@jcquittas您必须更改PickEntries extends never?
@jcquittas例如O extends unknown?
@jcquittas no这将不起作用。。我在找一个合适的工作solution@JCQuintas试试这个export const generateUnitStrings=(选项?:O)=>{
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>>
}
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 } })