为什么我不能在RxJs 6中简化为其他类型?

时间:2019-02-03 11:49:53

标签: javascript rxjs

下面的示例不适用于版本5中的链式运算符的直接转换。它给出Typescript编译器错误。

public void Configuration(IAppBuilder app)
{
            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
            AntiForgeryConfig.UniqueClaimTypeIdentifier = Constants.ClaimTypes.Subject;
            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap = new Dictionary<string, string>();

            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = "Cookies"
            });

            app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
            {
                Authority = "https://localhost/idprov/core",
                ClientId = "mvc",
                RedirectUri = "https://localhost/dummyclient/About",
                ResponseType = "id_token",
                ClientSecret = "secret",
                Scope = "openid partyuser",
                SignInAsAuthenticationType = "Cookies",
            });
 }

  

“ MonoTypeOperatorFunction”类型的参数不可分配   到“ OperatorFunction”类型的参数。种类   参数“源”和“源”不兼容。       类型“可观察”不能分配给类型“可观察”。         不能将“数字”类型分配给“字符串”类型。 [2345]

3 个答案:

答案 0 :(得分:1)

这是一个工作版本

from([1, 2])
  .pipe(
    reduce<number, string>(
      (acc, curr) => {
        return acc + ' ';
      }, '')
  ).subscribe(x => {
    console.log(x);
  });

现在要解释一下,这里的问题来自这一行(来自rxjs源代码)并定义了函数签名(类型)

export function reduce<T>(accumulator: (acc: T, value: T, index: number) => T, seed?: T): MonoTypeOperatorFunction<T>;

因此,在您的情况下,因为您没有明确地违反类型,rxjs认为accvalue来自同一类型(在您的情况下,number是因为您正在传递数字数组)

通过明确地定义函数参数的类型,我们正在解决此问题,因为我们可以帮助rxjs / ts使用下面的适当函数签名(这样就不会抛出错误)

export function reduce<T, R>(accumulator: (acc: R, value: T, index: number) => R, seed?: R): OperatorFunction<T, R>;

Here is the reduce source

如果我们必须总结一下,问题是rxjs / ts在键入方面需要一些明确的帮助。

答案 1 :(得分:0)

编辑:在OP描述他有TypeScript问题之前,回答了

您需要导入RxJ并订阅流:

rxjs.from([1, 2]).pipe(
    rxjs.operators.reduce((acc, curr) => {
        return acc + ' ' + curr;
    }, '')
).subscribe(console.log);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.4.0/rxjs.umd.min.js"></script>

答案 2 :(得分:0)

看起来您有两种不同的Observable库,它们分别来自RxJS的单独副本(可能来自较旧的版本)。通过执行package.json来查看重复软件包的package.lock.jsonnode_modules$ npm ls rxjs文件夹,或者只是删除此软件包并执行另一个全新安装。让我知道它是否有效!