如何为具有动态属性的扩展对象创建类型

约瑟夫·波德莱克

我正在寻找一种为具有附加动态属性的对象创建类型的方法。

这是我尝试过的。


interface Entity {
  id: string;
  name: string;
}

interface NestedEntity {
  id: string;
  name: string;
}

const getNestedObject = () => {
  return {
    id: "1",
    name: "test1",
  }
}

const expand = <T>(obj: Entity, path: string): Entity & { [path]: T } => {
  const nested = getNestedObject() as any;

  return {
    ...obj,
    [path]: nested,
  }
}

const entity: Entity = {
  id: "1",
  name: "test1",
}

const obj = expand<NestedEntity>(entity, "nested");
obj.nested // should be visible.

我认为Entity & { [path]: T }结果太天真了,应该以不同的方式完成。

如何解决这个问题?

干杯

约塞连船长

只需添加重载:

interface Entity {
  id: string;
  name: string;
}

interface NestedEntity {
  id: string;
  name: string;
}

const getNestedObject = () => {
  return {
    id: "1",
    name: "test1",
  }
}

function expand<Obj, Path extends string>(obj: Obj, path: Path): Obj & Record<Path, ReturnType<typeof getNestedObject>>
function expand<Obj, Path extends string>(obj: Obj, path: Path) {
  const nested = getNestedObject();

  return {
    ...obj,
    [path]: nested,
  }
}

const entity: Entity = {
  id: "1",
  name: "test1",
}

const obj = expand(entity, "nested");
obj.nested // should be visible.

操场

请记住,如果您使用像{ [path]:... }TS 这样的计算属性,则不会将 is 视为Record<path, any>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何为字段创建具有枚举类型的对象

如何动态创建具有只读属性的对象

创建具有动态属性的对象数组

动态创建具有通用属性的对象

如何为包含具有类型安全性的对象数组的 var 创建接口?

如何为所有整数类型创建扩展方法?

如何创建具有属性的内联对象?

如何在TypeScript中为具有动态属性的对象定义类型

TypeScript:如何为具有许多相同类型的键和相同类型的值的对象创建接口?

如何为具有可选属性的类型分配值?

如何在VBA中的excel中创建具有文件属性的动态对象列表

如何为在equals()中具有OR的对象创建哈希码?

如何创建具有强类型属性的对象,该对象也不允许引用不存在的属性?

如何为动态对象定义类型或接口?

如何创建具有动态参数类型的委托?

如何深度复制具有动态添加属性的对象?

如何建模具有动态属性的对象?

如何动态创建具有类属性的列表

jQuery:如何创建具有动态名称的普通对象?

如何在php中动态创建具有计数的对象?

如何为不同的数据类型创建动态属性并将其存储在mongodb中

当类具有封装的属性时,如何“隐藏类型”对象?

如何从json创建具有不同对象类型的列表

如何创建具有定义值类型的空对象

扩展具有隐藏属性的对象

具有动态属性的类型定义

如何创建具有公共属性值的对象数组

如何创建具有数字属性的对象?

如何避免创建具有相同属性的对象