2017-06-21 123 views
0

請看下面的接口聲明的成員:類型從一個字符串數組

interface Foo { 
    bar(keys: string[], handler: (parameter: any) => void): void; 
} 

我怎麼能代表該處理器的parameter與成員的鍵是keys陣列中的對象?

var x: Foo; 
x.bar(['First', 'Second'], x => { 
    console.log(x.First); 
    console.log(x.Second); 
}); 

回答

1

你想

  1. 的東西,抓住了字符串文字作爲串的工會文字類型
  2. 東西,可以採取文字類型的聯合,並創建一個對象的。

(1)可以與一類參數來完成(即,一個通用的)約束到string,和(2)可以用映射類型來完成 - 它只是恰巧打字稿於映射的類型,稱爲Record<K, T>與它:

interface Foo { 
    bar<K extends string>(keys: K[], handler: (parameter: Record<K, any>) => void): void; 
} 

var x: Foo; 
x.bar(['First', 'Second'], x => { 
    console.log(x.First); 
    console.log(x.); 
}); 

enter image description here

請記住,但是,如果有人在一個空數組或其他東西比一個字符串傳遞(如string類型的變量),那麼你會得到沒有類型安全。您將可以訪問x上的任何物業。

「給出一個空數組時,推斷空的工會,而不是string」您可以通過添加的never通用默認說得到周圍的空數組情況:

interface Foo { 
    bar<K extends string = never>(keys: K[], handler: (parameter: Record<K, any>) => void): void; 
} 
0

您可以使用mapped types到每個項目的映射數組鍵:

interface Foo { 
    bar<T extends string>(keys: T[], handler: (parameter: { 
     [P in T]: any 
    }) => void): void; 
} 

var x: Foo; 
x.bar(['First', 'Second'], x => { 
    console.log(x.First); 
    console.log(x.Second); 
    console.log(x.Third); //error 
}); 
相關問題