Open11

読者コミュニティ|Angular After Tutorial

Hidden comment
youpongyoupong

Angular を学ぶうえでとても役立つドキュメントだと思っています。ありがとうございます。

さて、「3-1. コンポーネントのテスト」の「コンポーネントのインプットのテスト」のコード例をテストした際に以下のようなエラーメッセージが表示されることに気づきました。

Error: src/app/title/title.component.spec.ts:13:13 - error TS2339: Property 'change' does not exist on type 'RenderResult<TitleComponent, TitleComponent>'.

13     const { change } = await render(TitleComponent, {

このとき、@testing-library/angular のバージョン 14.1.0 を使用しています。

上記エラーメッセージは @testing-library/angular のバージョン 13.4.0 ではエラーがでないことを確認しています。

https://zenn.dev/lacolaco/books/angular-after-tutorial/viewer/testing-component#コンポーネントのインプットのテスト

lacolacolacolaco

こちらの件お知らせいただきありがとうございました!

youpongyoupong

2-2. Observable にて、TypeScript でのプログラム例で、下記のように equality operators(==)が使われている箇所が2つあります。

    .filter((i) => i % 2 == 0)

これを strict equality operators(===)とした方が私は好きなのですが、いかがでしょうか。

T.KawaT.Kawa

いつも参考にさせてもらっています。ありがとうございます。
3-2.Single State StreamパターンのSingle State Stream の合成を実際に書いて試していたところ、意図しないであろう出力になりました(文字列の1文字目が表示される)。
意図するところとしては、下記のようにcombineLatestの第2引数の関数の引数は、配列でなくそのまま文字列ではないでしょうか。

  this.state$ = combineLatest(
    [this.dataService.valueChanges],
    (value) => ({ value }), // 引数は配列でなく文字列?
  );

ご確認のほど、よろしくお願いいたします。
(私が何か勘違いして間違っていたら無視してください)

追記:私の試した環境は以下のとおりです。

  • angular v16.2.0
  • rxjs 7.8.0
youpongyoupong

私も同様の結果(文字列の1文字目が表示される)結果となりました。修正案は期待した通りの振る舞いとなりました。

私の環境:

  • angular v16.1.4
  • rxjs v7.8.1
lacolacolacolaco

こちら、combineLatest関数の仕様がRxJS v7で変わったのに追従できていませんでした。第2引数のコールバック関数を使うのではなく、 map オペレータを使うのが適切ですね。修正します。

@Component({})
export class AsyncPipeComponent {
  // Single State Stream
  readonly state$: Observable<State>;

  constructor(private dataService: DataService) {
    this.state$ = combineLatest([this.dataService.valueChanges]).pipe(
      map(([value]) => ({ value }))
    );
  }
}