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

如何将TypeScript接口B的field类型改为A的任意两键点连接形式?

实现TypeScript接口中字段接受任意两个键的点连接组合类型

你可以通过TypeScript的模板字面量类型结合联合类型来实现这个需求,核心思路是将keyof A的联合类型拆分为两个独立的联合成员,再通过模板语法拼接成带点的字符串类型。

基础实现(允许相同键组合)

interface A {
  foo: string;
  bar: string;
  baz: string;
}

// 生成A的任意两个键的点连接组合类型
type TwoKeysOfA = `${keyof A}.${keyof A}`;

interface B {
  field: TwoKeysOfA;
}

验证使用

// 合法示例
const c: B = { field: 'foo.bar' };
const d: B = { field: 'baz.foo' };
const e: B = { field: 'bar.baz' };
const f: B = { field: 'foo.foo' }; // 允许相同键的组合

// 以下会触发类型报错
// const invalid1: B = { field: 'foo' }; // 单个键不符合要求
// const invalid2: B = { field: 'foo.bar.baz' }; // 超过两个键不符合要求
// const invalid3: B = { field: 'invalid' }; // 非A的键组合不符合要求

进阶实现(排除相同键组合)

如果需要禁止两个键相同的情况(比如"foo.foo"),可以通过映射类型结合Exclude来过滤:

interface A {
  foo: string;
  bar: string;
  baz: string;
}

// 生成A的不同两个键的点连接组合类型
type TwoDistinctKeysOfA = {
  [K1 in keyof A]: `${K1}.${Exclude<keyof A, K1>}`;
}[keyof A];

interface B {
  field: TwoDistinctKeysOfA;
}

此时TwoDistinctKeysOfA会生成"foo.bar" | "foo.baz" | "bar.foo" | "bar.baz" | "baz.foo" | "baz.bar"这样的联合类型,自动排除了相同键的组合。

内容的提问来源于stack exchange,提问作者LorDex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:26:07