2017-07-12 84 views
0

我有一些基于数据结构生成类的JavaScript代码,其方法的名称和签名取决于数据结构的内容。是否可以在TypeScript中表示这种关系?否则,是否有可能至少表明输出类具有一些特定的(但在编译时未知的)方法集合,以及一组可能的方法签名?是否可以表示在TypeScript中运行时定义其原型的类?

在我的特殊情况下,输入数据可能是这个样子:

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

,并有方法methodName1methodName2结果类,每个方法的4个预定义的方法签名一个基于签名在标志的值上。

+0

由于打字稿在编译时真的只存在,这是有道理的,它不能帮助你在运行时键入信息。 如果数据结构当然是不变的,你可以根据它来创建一个类型。如果它只能在运行时访问,我不确定你可以做什么比仅仅键入动态对象作为键值对更好。 你有没有你要写的代码的例子? – y2bd

+0

使用抽象接口而不是特定类可能对您更好 – Bergi

+0

您是否想在运行时或编译时生成这些类?请澄清。在编译时检查类型安全性。运行时间在编译时间之后。因此,你不能在编译时在运行时定义一个接口。考虑这是一个[X/Y问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem):也许你的问题不需要类型安全/编译时检查(你认为你必须生成类,而实际上不需要)。 –

回答

0

有了您的标志的例子,你可能能够创建使用某种类型相交的工厂:

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 
相关问题