You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript工具类型NestedKeyOf开启严格模式时失效

TypeScript工具类型NestedKeyOf在strict模式下处理可选属性失效问题

我自定义了TypeScript工具类型NestedKeyOf,用来提取嵌套对象的键并转为点表示法字符串(比如"parent.child")。这个类型在tsconfig.json中设置"strict": false时可以正常工作,但开启"strict": true后,处理包含可选属性的对象时就会出错。

原类型定义

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;

示例代码

定义如下接口:

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

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

期望以下代码可以编译通过,但在strict模式下会报错:

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

问题原因

开启strict: true后,TypeScript会严格处理可选属性的类型——可选属性的类型是T | undefined。原类型中T[K] extends object的判断会因为undefined的存在不成立,导致无法递归生成嵌套的键路径。

修复方案

修改类型定义,先排除undefined和null,再判断是否为对象:

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

或者更严谨地处理基础类型(比如string、number等非对象类型不递归):

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

修改后,即使在strict: true模式下,'ip_address.ipv6'也会被正确识别为NestedKeyOf<Node>的合法值。

内容的提问来源于stack exchange,提问作者Sai Satwik Kuppili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:17:10