我想创建一个对象,它既可以具有基本类型,也可以具有类似于其自身的对象作为属性.我的意思是,这样的事情是错误的:

const obj: DesiredType = {
  correctProp1: 'string',
  correctProp2: 123,
  correctProp3: true,
  wrongProp4: [1, 2, 3],
  prop5: {
    wrongProp1: () => {},         // Is neither an object nor a primitive
    wrongProp2: [1, 2, 3],        // Same
    correctProp3: 'other string'
  }
}

我不想只使用Record<string, any>,因为这样可以放入任何内容(函数、数组等).使用类似以下内容:

Record<string, string | number | boolean | Record<string, any>>

也是不好的,因为任何东西都可能出现在第二层

我试过这个:

type PrimitiveOrObject = string | number | boolean | Record<string, PrimitiveOrObject>; // ts(2456) type 

DesiredType = Record<string, PrimitiveOrObject>;

但我得到错误ts(2456):类型别名"PrimitiveOrObject"循环引用自身.

那么,有没有办法为包含原语或与其本身类似的对象的对象创建类型别名?

推荐答案

不能在创建类型别名的同一定义中通用地使用类型别名.但你可以在对象类型文字中使用它,所以如果我们添加一点间接的,我们可以得到你想要的递归.

type PrimitiveOrObject =
  string | number | boolean | { [key: string]: PrimitiveOrObject };

{ [key: string]: PrimitiveOrObject }语法称为index signature.对于键类型string,它等同于Record(有关详细信息,请参见this question),但它的好处是位于Object文本中,因此不受您所遇到的递归限制的约束.

Typescript相关问答推荐

Angular 过滤器形式基于某些条件的数组控制

带有联合参数的静态大小数组

如何用不同的键值初始化角react 形式

输入元素是类型变体的对象数组的正确方法是什么?'

在映射类型中用作索引时,TypeScrip泛型类型参数无法正常工作

在TypeScrip的数组中判断模式类型

TypeScrip-将<;A、B、C和>之一转换为联合A|B|C

有条件地删除区分的联合类型中的属性的可选属性

如何在Reaction路由v6.4加载器和操作中获得Auth0访问令牌?

如何消除在Next.js中使用Reaction上下文的延迟?

如何实现异构数组内函数的类型缩小

TypeScrip中的类型安全包装类

当传递带有或不带有参数的函数作为组件props 时,我应该如何指定类型?

TS不能自己推断函数返回类型

如何使用useSearchParams保持状态

如何限定索引值必须与相应属性的id字段相同

为什么过滤器不改变可能的类型?

如何让Record中的每个值都有独立的类型?

为什么 Typescript 无法正确推断数组元素的类型?

如何确定剧作家中给定定位器的值?