在 Typescript 泛型中的什么位置

Where in Typescript Generics

我有一个函数,它接受一个对象和一个 class 的名称(包含在该对象中)。获取一个对象的所有属性并不难(keyof O),并且确定一个键是否是 class 也不难(O[N] extends {new: (..args: any[]) => any})。但是,我无法将它们组合起来:

function foo<O, N extends keyof O where O[N] extends {new: (...args: any[]) => any}> (obj: O, name: N){}

我看过 Extract<T, U>,但我不能在 U 的检查中使用 T。我还能怎么做?

没有这样的语法,您可以向 O 添加约束,而不是强制 N 键具有您需要的任何类型:

function foo<O extends Record<N, new (...a: any) => any>, N extends keyof O> (obj: O, name: N){

}

let o = {
    a: class {},
    b: class {},
    c: 0,
}

foo(o, "a") // ok
foo(o, "c") // error

Playground Link