2017-01-02 69 views
5

我寫了獲取字符串數組,應該將它轉換成一件T數組的函數:返回使用Array.map(打字稿)的通用陣列

interface Fooable { 
    foo: string; 
} 

function simplifiedExample<T extends Fooable>(bars: string[]): T[] { 
    return bars.map(bar => { 
     return { 
      foo: bar 
     } 
    }) 
} 

但這個詞「吧」在第一線的功能用紅線標註,說:

TS2322:類型'{foo:string;} []'不能分配給'T []'類型。鍵入'{foo:string}'不可分配給'T'類型。

我該如何使它工作?

回答

4

您需要鍵入斷言返回Fooable鍵入T

function simplifiedExample<T extends Fooable>(bars: string[]): T[] { 
    return bars.map(bar => { 
     return { 
      foo: bar 
     } as T; 
    }) 
} 

code in playground

的原因是,TFooable,它只是擴展,但可能有額外的屬性,例如:

interface Mooable extends Fooable { 
    moo: string; 
} 

simplifiedExample<Mooable>(["a", "b", "c"]); 

在這種情況下TMooable{ foo: bar }不符合它,這就是爲什麼你需要輸入演員。

+0

我看到的大多數例子都是使用鑄造而不是「as」,例如'返回 {foo:bar};'而不是'return {foo:bar}作爲T;'是否有區別?如果是這樣,是否有充分的理由去用'as'而不是cast?或者他們只是兩種方式來做同樣的事情? –

+1

@TJCrowder來自[類型斷言](https://www.typescriptlang.org/docs/handbook/basic-types.html#type-assertions):「這兩個樣本是等價的。使用一個在另一個大多是一個首選項的選擇;但是,當通過JSX使用TypeScript時,只允許使用as-style聲明「。 –

+0

謝謝!我曾經踢過,但找不到它。因此'as'語法更加靈活(無論您是否使用JSX都可以使用),而如果您使用JSX,則無法使用強制轉換語法。 –