在組成一個可觀察的流時,從映射函式回傳一個元組被編譯器推斷為一個聯合而不是一個元組。
例如:
import { Component } from '@angular/core';
import { from } from 'rxjs';
import { map, tap } from 'rxjs/operators';
export class MyType {
constructor(private name: string) {}
}
@Component({
selector: 'my-app',
template: ''
})
export class AppComponent {
observable$ = from([new MyType('obj1'), new MyType('obj2')]).pipe(
map((value, index) => [value, index]),
tap(([value, index]) => console.log(value, index))
).subscribe();
}
在stackblitz上檢查一下,如果你將滑鼠懸停在函式引數上value或中,它們都會推斷出它應該何時理解和。indextapnumber | MyTypevalue: MyTypeindex: number
如果我通過填寫泛型來注釋地圖:map<MyType, [MyType, number]>(...那么輸入是正確的。
這是預期的行為嗎?打字稿不應該在不必顯式傳遞型別的情況下理解該元組嗎?
我在本地使用 rxjs @ 6.4.0 和 typescript @ 3.8.3,但是 stackblitz 有更新的版本并且仍然存在這種行為。
uj5u.com熱心網友回復:
在您的map函式中,您回傳的是一個陣列,而不是元組。
您可以使用as const強制元組型別:
export class AppComponent {
observable$ = from([new MyType('obj1'), new MyType('obj2')]).pipe(
map((value, index) => [value, index] as const),
tap(([value, index]) => console.log(value, index))
).subscribe();
}
請參閱元組型別:
帶有斷言的陣列字面量
const將被推斷為readonly元組型別
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/415118.html
標籤:
上一篇:將舊訂閱遷移到條帶
下一篇:僅使用名稱的Show的替代方案
