2017-08-07 71 views
1

我在这里简化了这个问题。带有泛型的动态接口

interface Identity{ 
    name: string; 
} 

另一个通用接口

interface State<T extends Identity>{ 
    [T.name] : StateContainer<T> 
} 

但因为它提供了错误这不会工作

才能找到t

如果我试图通过保持其内部产生的呢功能

function generate(c : Identity){ 
    interface State<T>{ 
     [c.name]: StateContainer<T> 
    } 
} 

它说

在接口必须直接引用内置符号,一种计算机属性名。

我希望的输出是具有动态接口。 State<Tenant>应该表现

interface State{ 
    'tenant': .... 
} 
+0

你到底想达到什么目的?我有点在Typescript方面,因为我不明白你的代码 – smnbbrv

+0

我真的试图泛化代码,我更新了我的预期输出 – Skeptor

+0

'Tenant'类型和'tenant'之间的连接是什么串?后者应该从哪里获取? – zerkms

回答

1

您可以使用mapped types

type State<T extends Identity> = { 
    [P in keyof T] : StateContainer<T> 
} 
+0

它给出错误:'计算出的属性名称必须是'string','number','symbol'或'any'类型。 找不到名字'keyof'.'你有没有尝试过,并为你工作。 – Skeptor

+0

这是一个[示例](http://www.typescriptlang.org/play/#src=interface%20Identity%7B%0D%0A%20%20%20%20name%3A%20string%3B%0D%0A% 7D%0D%0A%0D%0Ainterface%20StateContainer%3CT%3E%7B%0D%0A%20%20%20%20state%3A%20object%3B%0D%0A%7D%0D%0A%0D%0Ainterface% 20Tenant%20extends%20Identity%20%7B%0D%0A%20%20%20%20sometenantprop%3A%20number%0D%0A%7D%0D%0A%0D%0Atype%20State%3CT%20extends%20Identity%3E% 20%3D%20%7B%0D%0A%20%20%20%20%5BP%20英寸%20keyof%20T%5D%20%3A%20StateContainer%3CT%3E%0D%0A%7D%0D%0A% 0D%0Adeclare%20let%20x%3A%20State%3CTenant%3E%3B%0D%0Ax.sometenantprop) – Saravana

+0

但是,根据您更新的示例来判断,看起来您需要'Identity.name'的运行时值中的属性名称。我不认为这是可行的,因为接口仅在编译时可用。 – Saravana