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

在Typescript中使用RXJS的间隔和映射时键入错误。错误代码:ts(2740),typescript,rxjs,typescript-typings,rxjs-pipeable-operators,Typescript,Rxjs,Typescript Typings,Rxjs Pipeable Operators,我正在尝试在我的一个项目的typescript中使用rxjs,并且正在努力键入一个函数。 我试图给出一个类型(返回值类型)的函数是createMessageSource import { interval, Subscription, Observable } from 'rxjs'; import { map } from 'rxjs/operators'; type MessageType = { name: string; content: string; }

我正在尝试在我的一个项目的typescript中使用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命令的返回值应该是可观察的或订阅的。因此,到目前为止,我尝试了以下类型:

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

const createMessageSource: Subscription = ...
const createMessageSource:Observable=。。。
const createMessageSource:订阅=。。。
这两种组合都以vscode中显示的以下类型脚本错误结束:

类型“(句点:数字,名称:字符串,属性:字符串)=>Observable”缺少类型“Observable”中的以下属性:\u isScalar,source,operator,lift和其他6个。ts(2740)

Thx为获得事先的帮助,

确实,
.pipe()
返回了一个可观察的。您的问题是,
createMessageSource
不是一个可观察的函数,而是一个返回可观察的函数

因此,您可以定义一个新的
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}`,
          }))
        );
type MessageSourceFactory=(句点:数字,名称:字符串,内容:字符串)=>可观察;
const createMessageSource:MessageSourceFactory=
(期间:编号、名称:字符串、内容:字符串)=>
间隔(周期)。管道(
地图(i=>({
名称
内容:`${content}-${i}`,
}))
);
或者,如果满足您的需要,您可以将其定义为函数:

function createMessageSource(period: number, name: string, content: string): Observable<MessageType> {
  return interval(period).pipe(
    map(i => ({
      name,
      content: `${content} - ${i}`,
    }))
  );
}
函数createMessageSource(句点:数字,名称:字符串,内容:字符串):可观察{
返回间隔(周期)。管道(
地图(i=>({
名称
内容:`${content}-${i}`,
}))
);
}

createMessageSource的正确类型是
Observable
,因为您的代码不发射数组,而是单个对象。这是一个多么复杂的问题。谢谢老板的快速帮助。工作得很好,我觉得自己应该哑口无言!上帝保佑你,乐意帮忙。我们都有这样的时刻:-)