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

时间:2021-02-09 17:30:17

标签: typescript rxjs typescript-typings rxjs-pipeable-operators

我正在尝试在我的一个项目的打字稿中使用 rxjs,并且正在努力输入一个函数。 我试图提供类型(返回值类型)的函数是 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}`,
          })));

据我了解的问题,pipe 命令的返回值应该是一个 Observable 或者一个 Subscription。所以到目前为止我尝试了以下类型:

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

const createMessageSource: Subscription = ...

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

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

感谢事先的帮助

1 个答案:

答案 0 :(得分:1)

.pipe() 确实返回一个 Observable。您的问题是 createMessageSource 不是 Observable,而是一个 返回 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}`,
    }))
  );
}