typescript 排除`[键:string]:string;`从扩展接口

62o28rlo  于 2023-04-22  发布在  TypeScript
关注(0)|答案(1)|浏览(103)

我的问题是
我想通过做keyof Type1来获取一个接口的键,问题是Type1Type2扩展了,里面包含了[key: string]: SetOfValueTypes;,所以keyof Type1在没有重新定义类型的情况下是无用的。我仍然想保留SetOfValueTypes检查。所以我想保留Type1的当前定义,但只需要Type1的键类型,而不需要Type2
整个事情看起来有点像这样(这与我的接口不匹配,只是一个简化的表示):

// Initial base type
interface Type2 {
  [key: string]: SetOfValueTypes;
}

// New type that extends Type2 to make sure values are one of possible types
interface Type1 extends Type2 {
  email: string;
  phone: number;
}

// Extracting keys from Type1
type KeysOfType1 = keyof Type1;

// The key can be any string, because of [key: string] definition in Type2
const someKey: KeysOfType1 = 'can be anything';

我猜这是不可能的,因为'email''phone'文字类型是string类型的子集,但我真的希望有一种方法不需要重新定义Type1,因为Type1在我的情况下相当大。

2vuwiymt

2vuwiymt1#

您可以使用以下类型实现所需的结果。

type KeysOfType1 = keyof {[K in keyof Type1 as string extends K ? never : K]: Type1[K]};

基本上,emailphonestring,的子集,反之亦然。因此,检查string extends "phone"string extends "email"是不正确的。

相关问题