我正在构建一个类型,该类型判断类类型的成员是否是对象,如果是,则必须指定一个特定类型.我在下面提供了一个更具解释性的示例.

这里有一个我们将要使用的类示例.

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} | undefined

下面的代码解决了链接的TS操场上的错误.

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

Typescript相关问答推荐

Tailwind CSS样式不在Svelte应用程序中呈现

如何正确修复TypScript 4.7到4.8升级中的TS 2345编译错误

typescribe不能使用值来索引对象类型,该对象类型满足具有该值的另一个类型'

在TypeScript中使用泛型的灵活返回值类型

当我点击外部按钮时,如何打开Html Select 选项菜单?

基于平台的重定向,Angular 为16

rxjs forkJoin在错误后不会停止后续请求

接口中函数的条件参数

Cypress页面对象模型模式.扩展Elements属性

获取一个TypeScrip对象,并将每个属性转换为独立对象的联合

为什么&;(交集)运算符会删除不相交的属性?

按函数名的类型安全类型脚本方法包装帮助器

我可以使用typeof来强制执行某些字符串吗

棱角分明-什么是...接口类型<;T>;扩展函数{new(...args:any[]):t;}...卑鄙?

打字:注解`是字符串`而不是`布尔`?

如何在Vue动态类的上下文中解释错误TS2345?

参数未映射泛型返回类型

如何将 MUI 主题对象的自定义属性与情感样式组件中的自定义props 一起使用?

错误:仅允许在‘使用服务器’文件中导出异步函数

如何在故事书的Typescript 中编写decorator ?