2017-06-05 138 views
1

雖然我在整個人生中使用了許多不同情況下的可觀察模式,但我很難在RxJS Observables裏找到自己的頭。下面是一些代碼:RxJs Observable <string> vs Observable <string[]>

const observable: Observable<Response> = createdElswhere(); 
    let test1: Observable<string>; 
    let test2: Observable<string[]>; 

    test1 = observable.map(r => r.json()); 
    test2 = observable.map(r => r.json()); 

Response.json()返回數據數組 - 通常是將被映射到一個打字稿對象的對象,但他們只是在這種情況下字符串:

[ 
    "test1", 
    "test2", 
    "test3", 
    "test4" 
] 

當我訂閱test1test2屬性(在角度視圖模板中,或者在代碼中使用.subscribe()進行手動)時,可觀察的泛型類型似乎對框架沒有任何影響。即使observable內部的'data'不同(一個是數組,另一個是可觀察字符串的數組),項目顯示完全相同。

任何人都可以解釋Observable<string>Observable<string[]>之間的區別,並舉例說明他們應如何使用

+2

如果事件返​​回一個字符串數組,則應該使用;如果事件返​​回一個字符串數組,則返回。在這種情況下,您的observable似乎正在返回一個字符串數組。重要的是響應包含的內容。 :) – toskv

+0

這是我的想法。然而,我所有的觀測數據被定義爲Observable (而不是Observable ,但是我所有的數據都是作爲數組從後端返回的;我沒有收到TS警告,並且任何訂閱代碼似乎都不關心我定義它 – Spikeh

+1

你定義的類型只在編譯時,運行時所有的類型信息都會丟失,服務器返回的結果應該是你的observable的類型,你寫的類型在那裏描述,他們沒有強制它。我認爲這裏的問題是,你只是輸入你的觀察錯誤 – toskv

回答

1

Observable<string> meansthat您​​正在創建string類型

Observable<string[]> 一個觀察者意味着你正在創建的字符串

的陣列中的觀察者,因爲你是在打字稿編碼,它只是一個類型檢測,這有助於你的編譯器當你錯誤地嘗試分配變量。因爲類型的腳本被編譯成JavaScript它可是沒有類型檢查所以無論dosent什麼你

例如賦值: **在打字稿**

let k:int;

k=r.json().val;

在javascript編譯的代碼等於

var k;

k=r.json().val;

所以如果r.json().val返回整數,那麼k將成爲i​​nt和k爲弦,它就會成爲串

0

Observable<string>是其中每個發射值被認爲是一個字符串可觀測量的類型。 Observable<string[]>是其中每個發射值應該是一個字符串數組的可觀察類型。

無論您指定給observable的類型如何,都不會改變observable實際發出的內容。這僅取決於觀察結構的構建方式。如果你做observable.map(r => r.json())r.json返回一個字符串,那麼得到的observable將發出字符串,如果它返回一個字符串數組,那麼得到的observable將會發出字符串數組。

說,如果r.json具有像(r: Response): string[]一個類型簽名,打字原稿應該抱怨test1的類型不兼容。

相關問題