Typescript 有条件扩展嵌套对象

标签 typescript extends

我正在构建一个类型,用于检查类类型的成员是否是对象,如果是,则必须分配特定类型。我在下面提供了一个更具解释性的示例。

这里有我们将要使用的类示例。

declare class myObject {
    name?: string
    id?: number
    parent?: {
        child: number
    }
}

这里有我想要制作的类型

type myType<T> = {
    [K in keyof T]: T[K] extends {[k:string]:any} ? T[K] : "something"
}

它应该检查parent成员实际上是该类型的对象,并允许这样的事情

const example: myType<myObject> = {
    parent: {
        child: 0
    },
    name: "something"
    id: "something"

但事实并非如此,因为 parent? 未针对 {[k:string]:any} 成功检查。发生这种情况是因为 parent? 是可选成员。如果我将 parent? 更改为 parent ,它会按预期工作。为了尝试解决这个问题,我尝试将 {[k:string]:any}{[Z in keyof T[K]]?: T[K][Z]} 但我观察到了同样的行为。

指向 TS Playground 的链接

最佳答案

当你说这种情况发生时,你是对的,因为 parent? 是一个可选成员。

但是成为可选成员意味着什么?

在 JS 中,这意味着属性可以有值,也可以未定义。

在TS中,这意味着parent?的类型实际上是这样的:{[k:string]: any} |未定义

下面的代码解决了链接的 TS Playground 上的错误。

type myType<T> = {
    [K in keyof T]?: T[K] extends ({[k:string]: any} | undefined) ? T[K] : "something"
}

关于Typescript 有条件扩展嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72845847/

相关文章:

javascript - 如何跟踪 Angular 中一个组件中另一个组件中发出的值的变化

c# - 如何向密封类 Arc 添加属性

javascript - 使用 Lerna 将 JavaScript 导入 TypeScript 应用程序

javascript - ValidationPipe() 不适用于 Nestjs/Crud 中的重写 @Query

typescript - 是否可以在 TypeScript 中推断记录的键?

python - 如何在用户输入后永久更改列表?

Java:扩展内部类

angularjs - 扩展 angularJS 模块

javascript - 扩展类时使用 super() 的区别

typescript - Maybe monad 在 TypeScript 中有何用处?