2017-08-07 117 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