当前位置: 首页 > article >正文

带点符号的 TypeScript 实用程序类型 NestedKeyOf 在严格模式下失败

优质博文:IT-BLOG-CN

问题

我正在使用自定义 TypeScript 实用程序类型NestedKeyOf将嵌套键提取为点分符号字符串,例如。该类型在 中"parent.child"按预期工作,但启用会导致问题,尤其是可选属性。“strict”: falsetsconfig.json"strict": true

这是我的NestedKeyOf类型定义:

    type NestedKeyOf<T> = T extends object
       ? {
            [K in keyof T & string]: T[K] extends object
              ? K | `${K}.${NestedKeyOf<T[K]>}`
              : K;
         }[keyof T & string]
       : never;

我正在使用自定义 TypeScript 实用程序类型NestedKeyOf将嵌套键提取为点分符号字符串,例如。该类型在 中"parent.child"按预期工作,但启用会导致问题,尤其是可选属性。“strict”: falsetsconfig.json"strict": true

这是我的NestedKeyOf类型定义:

    type NestedKeyOf<T> = T extends object
       ? {
            [K in keyof T & string]: T[K] extends object
              ? K | `${K}.${NestedKeyOf<T[K]>}`
              : K;
         }[keyof T & string]
       : never;

在 Angular 编译期间,此类型按预期工作,当在中"strict": false设置时angularCompilerOptionstsConfig.json

示例代码:

以下是具有以下类型的示例:

export interface Node {
  name: string;
  version?: string;
  ip_address?: IPAddress;
}

export interface IPAddress {
  ipv4?: string;
  ipv6?: string;
};

我期望`下代码能够编译:

const nkn: NestedKeyOf<Node> = 'ip_address.ipv6';

解决方案

您需要将对象标记为具有所有必需的键。例如,如果ip_address是可选的,则其值是IPAddress | undefined,它不是的子集object:

type T = Node[‘ip_address’] extends object ? true : false // false
因此,您需要使所有对象键都成为必需的,以便深入了解子对象:

const nkn: NestedKeyOf<Node> = 'ip_address.ipv6'

export interface Node {
  name: string;
  version?: string;
  ip_address?: IPAddress;
}

export interface IPAddress {
  ipv4?: string;
  ipv6?: string;
}

type NestedKeyOf<T extends object, R extends Required<T> = Required<T>> =  keyof {
    [K in keyof R & string as R[K] extends object ? K | `${K}.${NestedKeyOf<R[K]>}` : K]: any
}

http://www.kler.cn/a/384232.html

相关文章:

  • 默认 iOS 设置使已锁定的 iPhone 容易受到攻击
  • 双指针算法篇——一快一慢须臾之间解决问题的飘逸与灵动(3)
  • SpringMVC项目转为SpringBoot项目
  • Minio工作类MinioUtils的配置及使用示例
  • GODOT 4 不用scons编译cpp扩展的方法
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit
  • 卷积神经网络——paddle部分
  • 初阶数据结构【单链表及其接口的实现】
  • 分数阶傅里叶变换与信息熵怎么用于信号处理?
  • 基于SpringBoot+Vue+HTML的美食食谱系统的设计与实现
  • Spark程序的监控
  • Python配合Flask搭建简单的个人博客案例demo
  • 【react】Redux基础用法
  • 【Linux】进程控制——创建,终止,等待回收
  • Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
  • 7-在Ubuntu中使用超级终端Terminator提高工作效率
  • C++入门基础知识141—【关于C++ 拷贝构造函数】
  • Python函数专题:引用传参
  • metrics
  • Java教育技术革新:基于SpringBoot的平台
  • Angular数据绑定详解
  • web——sqliabs靶场——第一关
  • RibbitMQ-安装
  • K8S网络插件故障处理
  • 【STM32】DMA直接存储器读取
  • linux crash使用和环境部署