假设我在Typescript 中有这样的类型:

type State = {
  one?: string;
  two?: {
    three?: {
      four?: string;
      five?: string;
      six: number
    },
    seven: string
  }
}

在只需要four的情况下,如何通过重复使用State来创建新的类型?其余的应该保持不变.

我认为我应该使用Required实用程序类型,但我不确定如何将其应用于特定的嵌套属性.

Why I'm asking. Context:

一般而言,我有一个类似于State[]State数组,并且在某个点上,Ifiltermap通过呈现属性four(某个id)来陈述,如下所示:

const states: State[] = [...];
states
  .filter((state) => state.two?.three?.four && valid(state.two?.three?.four))
  .map((state) => mapFour(state.two.three.four))

还有编译器抱怨mapFour中的state.two.three.four可能是undefined的问题,因为type narrowing doesn't flow through scopes.

因此,我需要编写一个显式类型保护注释,如下所示: .filter((state):state is MyNewTypeWhereFourIsNotOptinal => ...)

这就是为什么我问如何创建一个需要一些深度嵌套属性的新类型.

推荐答案

类似这样的东西(但这不是通用的)

type State = {
  one?: string;
  two?: {
    three?: {
      four?: string;
      five?: string;
      six: number
    },
    seven: string
  }
}

type FourRequiredState = {
    two: {
        three: {
            four: string
        }
    }
} & State

//Now we can't skip four

const fourRequiredState: FourRequiredState = {
    two: {
        three: {
            four: '4',
            six: 0
        },
        seven: '7'
    }
}

Typescript相关问答推荐

返回对象的TypScript构造函数隐式地替换This的值来替换super(.)的任何调用者?

如何在函数参数中使用(或模仿)`success`的行为?

在Typescribe中,extends工作,但当指定派生给super时出错""

如何根据另一个属性的布尔值来缩小函数属性的返回类型?

contextPaneTitleText类型的参数不能分配给remoteconfig类型的关键参数'""'''

使用泛型keyof索引类型以在if-condition内类型推断

如何在typescript中设置对象分配时的键类型和值类型

如何编写一个类型脚本函数,将一个对象映射(转换)为另一个对象并推断返回类型?

在Typescript 中,有没有`index=unfined的速记?未定义:某个数组[索引]`?

Select 下拉菜单的占位符不起作用

从泛型类型引用推断的文本类型

Typescript 类型守卫一个类泛型?

TYPE FOR ARRAY,其中每个泛型元素是单独的键类型对,然后在该数组上循环

为什么S struct 类型化(即鸭子类型化)需要非严格类型联合?

如何以类型安全的方式指定键的常量列表,并从该列表派生所挑选的接口?

有没有一种方法可以提升对象的泛型级别,而对象的值是泛型函数?

可以将JS文件放在tsconfig';s includes/files属性?或者,我如何让tsc判断TS项目中的JS文件?

如何在TypeScript中将元组与泛型一起使用?

具有枚举泛型类型的 Typescript 对象数组

在对象类型的类型别名中,属性是用分号 (;) 还是逗号 (,) 分隔的?