Typescript 在枚举中使用键时排除枚举项

Typescript 在枚举中使用键时排除枚举项,typescript,Typescript,我有这样一个枚举(只是稍微大一点): 我使用它来定义需要使用这些键的类型: export type MyTypeKeyFunctionValue = { [key in MyTypeEnum ]?: Function }; export type MyTypeKeyStringValue = { [key in MyTypeEnum ]?: string }; 所以在我的课堂上,我可以做一些类似的事情: private memberWithFunctions: MyTypeKeyFunctio

我有这样一个枚举(只是稍微大一点):

我使用它来定义需要使用这些键的类型:

export type MyTypeKeyFunctionValue = { [key in MyTypeEnum ]?: Function };
export type MyTypeKeyStringValue = { [key in MyTypeEnum ]?: string };
所以在我的课堂上,我可以做一些类似的事情:

private memberWithFunctions: MyTypeKeyFunctionValue; 
现在,我遇到了一个特殊情况,当一些成员需要在
MyTypeEnum
中拥有所有键,但只有一个(比如说
two
)时,我不知道如何定义一个类型来排除该键,但保留所有其他键


有什么方法可以做到这一点吗?

您可以使用
Exclude
条件类型从
enum

export type MyTypeKeyStringValue = { 
    [key in Exclude<MyTypeEnum, MyTypeEnum.two> ]?: string
 };
导出类型MyTypeKeyStringValue={
[输入排除]?:字符串
};

使用
省略
类型跳过属性

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
类型省略=拾取;
用法:

const foo: Omit<MyTypeKeyFunctionValue, MyTypeEnum.two> = {
  /* ... */
}
const foo:Omit={
/* ... */
}

当我声明
memberWithFunctions:MyTypeKeyStringValue
并以这种方式使用它时:
this.memberWithFunctions[someEnumValue]
Typescript说:元素隐式具有“any”类型,因为类型“MyTypeKeyStringValue”没有索引签名。[7017]@distante由于某些enum成员不能是密钥,因此您需要防范它们。第一次访问导致错误第二次访问没有:
声明let a:MyTypeKeyStringValue;声明let x:MyTypeEnum;设r0=a[x]如果(x!==MyTypeEnum.two){let r=a[x]}
我明白了!我永远不会从那个错误中得出那个结论。谢谢你@titian cernicova dragomir。也许你应该在答案中加上这个?
const foo: Omit<MyTypeKeyFunctionValue, MyTypeEnum.two> = {
  /* ... */
}