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

问题描述 投票:0回答:1

我正在使用自定义 TypeScript 实用程序类型

NestedKeyOf
将嵌套键提取为点符号字符串,例如
"parent.child"
。该类型与
"strict": false
中的
tsconfig.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;

当在

"strict": false
 中的 
angularCompilerOptions
 中设置 
tsConfig.json

时,此类型在 Angular 编译期间按预期工作。

示例代码:

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

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

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

我希望编译以下代码:

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

StackBlitz 链接

我创建了一个示例来重现该问题。

typescript
1个回答
0
投票

您需要将对象标记为具有所需的所有键:

游乐场

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
}
© www.soinside.com 2019 - 2024. All rights reserved.