在 Typescript 中使用 RXJS 的间隔和映射时键入错误。错误代码:ts(2740)

Type Error while using interval and map with RXJS in Typescript. errorcode: ts(2740)

我正在尝试在我的一个项目中使用打字稿中的 rxjs,但我正在努力输入一个函数。 我试图给一个类型(Return值类型)的函数是createMessageSource.

import { interval, Subscription, Observable } from 'rxjs';
import { map } from 'rxjs/operators';

type MessageType = {
      name: string;
      content: string;
}

const createMessageSource =
      (period: number, name: string, content: string) =>
        interval(period)
          .pipe(map(i => ({
            name,
            content: `${content} - ${i}`,
          })));

据我了解问题,管道命令的 return 值应该是 Observable 或 Subscription。所以到目前为止我尝试了以下类型:

const createMessageSource: Observable<MessageType[]> = ...

const createMessageSource: Subscription = ...

两种组合都以 vscode 中显示的以下打字稿错误结尾:

类型'(句点:数字,名称:字符串,属性:字符串)=>Observable<{名称:字符串;内容:数量; }>' 缺少类型 'Observable<MessageType[]>' 中的以下属性:_isScalar、source、operator、lift 和 6 more.ts(2740)

感谢事先的帮助

确实 .pipe() returns 是一个 Observable。你的问题是 createMessageSource 不是一个 Observable,而是一个 函数 returns 一个 Observable :-)

因此您可以定义一个新的 MessageFactory 类型:

type MessageSourceFactory = (period: number, name: string, content: string) => Observable<MessageType>;


const createMessageSource: MessageSourceFactory =
      (period: number, name: string, content: string) =>
        interval(period).pipe(
          map(i => ({
            name,
            content: `${content} - ${i}`,
          }))
        );

或者您可以将其定义为函数,如果满足您的需要:

function createMessageSource(period: number, name: string, content: string): Observable<MessageType> {
  return interval(period).pipe(
    map(i => ({
      name,
      content: `${content} - ${i}`,
    }))
  );
}