Typescript 动态、变量或基于索引的泛型类型变量

Typescript 动态、变量或基于索引的泛型类型变量,typescript,typescript-generics,Typescript,Typescript Generics,我想键入一个函数,该函数以数组元素或数组的形式将各种类作为输入,数组由类及其方法的名称组成。诸如此类: fn([Class1,Class2,[Class3,'method3'],…,ClassN]); 我还想严格指出,如果选择了[[class,method]]模式,则可以只指定这个特定类的方法 type Class=new(…args:any[])=>T; 甲级{ a():任何{} } B类{ b():任何{} } // ... 函数fn(参数:数组< 类//引用此线程-以及以下代码- typ

我想键入一个函数,该函数以数组元素或数组的形式将各种
类作为输入,数组由
类及其
方法的名称组成。诸如此类:

fn([Class1,Class2,[Class3,'method3'],…,ClassN]);
我还想严格指出,如果选择了
[[class,method]]
模式,则可以只指定这个特定类的方法

type Class=new(…args:any[])=>T;
甲级{
a():任何{}
}
B类{
b():任何{}
}
// ...
函数fn(参数:数组<
类//引用此线程-以及以下代码-

type Class=new(…args:any[])=>T;
甲级{
a():任何{}
}
B类{
b():任何{}
}
类型ArgType=Class |[Class,keyof T]
类型ArgDefinition={
[K in keyof T]:ArgType[]
}
声明函数fn(arg:ArgDefinition):void
fn({a:[
A.
[A,'A'],//显示错误
B
[B,'B'],//显示错误
]})
类型X=ArgType
函数
fn
中参数中对象中属性
a
的推断类型为
ArgType
  • 引用此线程-以及以下代码-

    type Class=new(…args:any[])=>T;
    甲级{
    a():任何{}
    }
    B类{
    b():任何{}
    }
    类型ArgType=Class |[Class,keyof T]
    类型ArgDefinition={
    [K in keyof T]:ArgType[]
    }
    声明函数fn(arg:ArgDefinition):void
    fn({a:[
    A.
    [A,'A'],//显示错误
    B
    [B,'B'],//显示错误
    ]})
    类型X=ArgType
    函数
    fn
    中参数中对象中属性
    a
    的推断类型为
    ArgType
    

  • 首先,请确保编译器不会对数组进行变异,换句话说,它是一个元组。如果传入数组文字,则必须使用const断言(
    as const
    )。一旦执行此操作,您将看到定义的类型不适合此任务:

    类型“readonly[typeof A,readonly[typeof A,“A”]、typeof B、readonly[typeof B,“B”]]”是“readonly”,不能分配给可变类型(“类|[Class,never])[]

    请注意,
    keyof T
    被解析为
    never
    ,因为
    keyof unknown
    never
    。为什么?因为签名接受一个可变的
    数组,而我们传递一个
    ReadonlyArray
    。这很容易修复,但需要我们进行平方运算,因为
    T
    被推断为元组:

    函数fn(arg:ReadonlyArray<
    
    类//首先,确保编译器不会对数组进行变异,换句话说,是一个元组。如果传入数组文本,则必须使用常量断言(
    as const
    )。一旦执行此操作,您将看到定义的类型不适合此任务:

    类型“readonly[typeof A,readonly[typeof A,“A”]、typeof B、readonly[typeof B,“B”]]”是“readonly”,不能分配给可变类型(“类|[Class,never])[]

    请注意,
    keyof T
    被解析为
    never
    ,因为
    keyof unknown
    never
    。为什么?因为签名接受一个可变的
    数组,而我们传递一个
    ReadonlyArray
    。这很容易修复,但需要我们进行平方运算,因为
    T
    被推断为元组:

    函数fn(arg:ReadonlyArray<
    
    类//您能解释一下您尝试了什么以及在哪里发现了问题吗?我试图为
    T
    提出一个索引结构。类似于
    T[I in keyof T]
    ,但它对我不起作用。你能解释一下你尝试了什么以及在哪里发现了问题吗?我试图为
    t
    提出一个索引结构。类似于
    t[I in keyof t]
    ,但它对我不起作用。