Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据Typescript中输入对象的属性,使用键从函数返回对象_Javascript_Typescript - Fatal编程技术网

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 } })