Javascript 是否可以用TypeScript表示其原型在运行时定义的类?

Javascript 是否可以用TypeScript表示其原型在运行时定义的类?,javascript,typescript,Javascript,Typescript,我有一些基于数据结构生成类的JavaScript代码,其方法的名称和签名取决于该数据结构的内容。是否可以在TypeScript中表示此关系?如果做不到这一点,是否可以至少指出输出类有一些特定(但在编译时未知)的方法集,以及一组特定的可能方法签名 在我的特殊情况下,输入数据可能如下所示: { 'methodName1': { 'flag1': true, 'flag2': false }, 'methodName2': { 'flag1': false,

我有一些基于数据结构生成类的JavaScript代码,其方法的名称和签名取决于该数据结构的内容。是否可以在TypeScript中表示此关系?如果做不到这一点,是否可以至少指出输出类有一些特定(但在编译时未知)的方法集,以及一组特定的可能方法签名

在我的特殊情况下,输入数据可能如下所示:

{
  'methodName1': {
    'flag1': true,
    'flag2': false
  },
  'methodName2': {
    'flag1': false,
    'flag2': false
  }
}

生成的类具有方法
methodName1
methodName2
,每个方法的签名是基于标志值的4个预定义方法签名之一。

通过标志示例,您可以使用交叉点类型创建排序工厂:

type Switch<A, B, C, D> =
  & ((f1: false, f2: false) => A)
  & ((f1: false, f2: true) => B)
  & ((f1: true, f2: false) => C)
  & ((f1: true, f2: true) => D);

declare let provider: Switch<
  (arg: number) => number,
  (arg: string) => string,
  (arg: boolean) => boolean,
  (arg: Date) => Date
>;

let afun = provider(false, false);
afun(3); // returns number

let bfun = provider(false, true);
bfun("hello"); // returns string

let cfun = provider(true, false);
cfun(false); // returns boolean

let dfun = provider(true, true);
dfun(new Date()); // returns Date
类型开关=
&((f1:false,f2:false)=>A)
&((f1:false,f2:true)=>B)
&((f1:true,f2:false)=>C)
&((f1:true,f2:true)=>D);
声明let提供程序:开关<
(arg:number)=>number,
(arg:string)=>string,
(arg:boolean)=>boolean,
(arg:Date)=>日期
>;
设afun=provider(false,false);
afun(3);//返回号码
设bfun=provider(false,true);
bfun(“你好”);//返回字符串
设cfun=provider(true,false);
cfun(假);//返回布尔值
设dfun=provider(true,true);
dfun(新日期());//返回日期

通过标记示例,您可以使用交叉点类型创建排序工厂:

type Switch<A, B, C, D> =
  & ((f1: false, f2: false) => A)
  & ((f1: false, f2: true) => B)
  & ((f1: true, f2: false) => C)
  & ((f1: true, f2: true) => D);

declare let provider: Switch<
  (arg: number) => number,
  (arg: string) => string,
  (arg: boolean) => boolean,
  (arg: Date) => Date
>;

let afun = provider(false, false);
afun(3); // returns number

let bfun = provider(false, true);
bfun("hello"); // returns string

let cfun = provider(true, false);
cfun(false); // returns boolean

let dfun = provider(true, true);
dfun(new Date()); // returns Date
类型开关=
&((f1:false,f2:false)=>A)
&((f1:false,f2:true)=>B)
&((f1:true,f2:false)=>C)
&((f1:true,f2:true)=>D);
声明let提供程序:开关<
(arg:number)=>number,
(arg:string)=>string,
(arg:boolean)=>boolean,
(arg:Date)=>日期
>;
设afun=provider(false,false);
afun(3);//返回号码
设bfun=provider(false,true);
bfun(“你好”);//返回字符串
设cfun=provider(true,false);
cfun(假);//返回布尔值
设dfun=provider(true,true);
dfun(新日期());//返回日期

由于Typescript实际上只在编译时存在,所以它不能帮助您在运行时键入信息。当然,如果数据结构是常量,则可以基于它创建类型。但是,如果它只能在运行时访问,那么我不确定您是否能做得比只将动态对象作为键值对键入更好。您是否有将要编写的代码的示例?使用抽象接口而不是特定类可能更适合您您您是否希望在运行时或编译时生成这些类?请澄清。在编译时检查类型安全性。运行时在编译时间之后。因此,您不能在运行时定义在compiletime中使用的接口。考虑到这是一个问题:也许你的问题不需要类型安全/编译时间检查(你认为你必须在不必要的时候生成类)。我说这是在问题的标题中运行时。这是现有API的一部分,更改该API不是可行的选择。我知道运行时在编译时之后。我试图理解的是,这在多大程度上可以用TypeScript来表示,这样我至少可以提供部分类型安全性。正如我在问题中所说的,我想知道我是否至少可以指出生成的类上的方法有一组特定的方法签名,即使我不能指定名称。很抱歉,我没有重新阅读标题,也没有在问题中找到“when”的痕迹。如何定义这些方法的功能(它们的实现来自哪里)?仅仅定义空方法是没有任何用处的。他们是假设某个基类提供了一个“对等”接口,还是什么都不引用(通过参数获取数据并返回结果)或全局变量?应用程序的其余部分如何知道如何调用这些方法?请再显示一点示例(伪)代码。JSON中是否有未确定的方法名,或者JSON是否会传递一小部分已知方法?因为Typescript实际上只在编译时存在,所以它不能帮助您在运行时键入信息。当然,如果数据结构是常量,则可以基于它创建类型。但是,如果它只能在运行时访问,那么我不确定您是否能做得比只将动态对象作为键值对键入更好。您是否有将要编写的代码的示例?使用抽象接口而不是特定类可能更适合您您您是否希望在运行时或编译时生成这些类?请澄清。在编译时检查类型安全性。运行时在编译时间之后。因此,您不能在运行时定义在compiletime中使用的接口。考虑到这是一个问题:也许你的问题不需要类型安全/编译时间检查(你认为你必须在不必要的时候生成类)。我说这是在问题的标题中运行时。这是现有API的一部分,更改该API不是可行的选择。我知道运行时在编译时之后。我试图理解的是,这在多大程度上可以用TypeScript来表示,这样我至少可以提供部分类型安全性。正如我在问题中所说的,我想知道我是否至少可以指出生成的类上的方法有一组特定的方法签名,即使我不能指定名称。很抱歉,我没有重新阅读标题,也没有在问题中找到“when”的痕迹。如何定义这些方法的功能(它们的实现来自哪里)?仅仅定义空方法是没有任何用处的。他们是假设某个基类提供了一个“对等”接口,还是什么都不引用(通过参数获取数据并返回结果)或全局变量?应用程序的其余部分是如何知道的