Typescript 表单“”的通用约束<;T扩展E>;`其中'E'是'enum'?

Typescript 表单“”的通用约束<;T扩展E>;`其中'E'是'enum'?,typescript,generics,enums,typescript-generics,Typescript,Generics,Enums,Typescript Generics,这是什么意思 函数f(obj:T){code> 其中E是一些enum类似的,比如 enum E{ X } 由于enums实际上无法扩展,是否可以删除此约束并将函数重写为: 函数f(obj:E){ PS:代码是否有问题。如果您的函数中不需要t类型,那么您是对的,is不需要是泛型的 但是,在链接的文件中,该类型在类中使用 以下是相关的部分,其他部分被删除: abstract class ComputedEditorOption<K1 extends EditorOption, V>

这是什么意思

函数f(obj:T){code> 其中
E
是一些
enum
类似的,比如

enum E{
X
}
由于
enum
s实际上无法扩展,是否可以删除此约束并将函数重写为:

函数f(obj:E){

PS:代码是否有问题。

如果您的函数中不需要
t
类型,那么您是对的,is不需要是泛型的

但是,在链接的文件中,该类型在类中使用

以下是相关的部分,其他部分被删除:

abstract class ComputedEditorOption<K1 extends EditorOption, V> implements IEditorOption<K1, V> {

    public readonly id: K1;

    constructor(id: K1, deps: EditorOption[] | null = null) {
        this.id = id;
        //...
    }
}
在此处键入参数为
MyEnum
时,不能使用返回类型中提供的枚举,因此最好将返回值键入为
MyEnum
,因为您不知道提供了该枚举的哪个值

但是,当您使用泛型时:

function f2<T extends MyEnum>(arg: T): { id: T } {
    return { id: arg }
}

const a2 = f2(MyEnum.A) // Type: MyEnum.A
const b2 = f2(MyEnum.B) // Type: MyEnum.B
函数f2(arg:T):{id:T}{
返回{id:arg}
}
const a2=f2(MyEnum.A)//类型:MyEnum.A
const b2=f2(MyEnum.B)//类型:MyEnum.B
现在,您可以在返回类型中使用提供的参数类型

这或多或少就是您链接的代码所做的


如果类型扩展了枚举,则表示该类型可以是:

  • 枚举的一个特定值
  • 枚举值的某些子集
  • 枚举的所有可能值
假设我们的枚举有三个值:

enum E {
    X,
    Y,
    Z
}

function f<T extends E>(val: T) {}
在任何情况下,
E.X
都可分配给
T
(即,
E.X
等于或比
T
窄),并且
T扩展了E
(即,
T
等于或比
E
窄)

enum E {
    X,
    Y,
    Z
}

function f<T extends E>(val: T) {}
f<E>(E.X);
f<E.X>(E.X);
f<E.X | E.Y>(E.X);
f<Exclude<E, E.Y>>(E.X);