首页 > 解决方案 > 带有包罗万象的道具的可能递归对象的打字稿接口

问题描述

我正在尝试在打字稿中定义一个可选递归结构,如下所示:

interface SceneObject {
  name: string
  type: string
  children?: SceneObject[]
  [k: string]: object|string|Array<number>
}

但是 ts 抱怨我的children对象,说:Property 'children' of type 'SceneObject[] | undefined' is not assignable to string index type 'string | object | number[]'

它似乎在最后childrenk总括之间混淆了。我如何捕捉可能children道具的对象的这个概念,如果有,它必须是一个SceneObject[]

注意:如果我设为children非可选,则编译正常。也许我需要的是某种方式来表明包罗万象的条款不能是“孩子”?

编辑:这是一个可行的解决方案:

interface SceneObjectCore {
  name: string
  type: string
  children?: SceneObject[]
}

type SceneObject = SceneObjectCore & {
  [k: string]: object|string|Array<number>
}

let a: SceneObject = {
  name: "myname",
  type: "mytype",
  otherProp: [123],
  children: [{
    name: "name2",
    type: "child"
  }]
}

标签: typescript

解决方案


这里有一个类似的问题:如何从类型中排除索引签名?

除了那里接受的答案外,我还要补充一点,您可以定义您的“catchall”以包含undefined与您的定义匹配的内容children

[k: string]: object | string| Array<number>| undefined


推荐阅读