【问题标题】:Type 'Observer<T>[]' is not assignable to type 'Observer<unknown>[]'类型 'Observer<T>[]' 不可分配给类型 'Observer<unknown>[]'
【发布时间】:2021-09-22 15:50:38
【问题描述】:

由于下面显示的错误,以下示例无法编译(在最后两行)。

import { Subject } from 'rxjs';

class Example<T> {

  readonly events = new Subject<T>();

  constructor(x: T) { }
}

// ...

let example: Example<unknown>;

// ...

example = new Example('some string');

// ...

example = new Example(123);

错误:

Type 'Example<string>' is not assignable to type 'Example<unknown>'.
  Types of property 'events' are incompatible.
    Type 'Subject<string>' is not assignable to type 'Subject<unknown>'.
      Types of property 'observers' are incompatible.
        Type 'Observer<string>[]' is not assignable to type 'Observer<unknown>[]'.
          Type 'Observer<string>' is not assignable to type 'Observer<unknown>'.
            Type 'unknown' is not assignable to type 'string'.ts(2322)

我看到此错误的项目使用的是 Typescript 4.3.5 版和 RxJs 6.5.5 版。只有在 tsconfig.json 中启用了 strict 标志时,才会发生该错误。

我不明白为什么我会看到这个错误。错误消息中的每一行(最后一行除外)对我来说都不是错误,因为它表示将具体类型分配给未知类型,这是一个有效的分配。对于最后一行 (Type 'unknown' is not assignable to type 'string'),我知道将 unknown 分配给 string 会出错,但我看不到这样的分配发生在哪里。

代码示例有什么问题?

编辑

我还注意到,如果我删除 Example 类中的 events 属性,错误就会消失。

【问题讨论】:

  • 你自己输入的是未知的,这行let example: Example&lt;unknown&gt;; 。只需将unknown 更改为string
  • 请注意,这是一个缩小范围的示例。我无法将unknown 更改为string,因为代码的其他部分可能会将不同类型的Example 分配给example。我编辑了我的问题以使其更清楚。

标签: typescript rxjs


【解决方案1】:

这是有问题的,因为您的 example 变量是 unknown 类型。

unknown 类型只能分配给 any 类型,并且 unknown 类型本身。查看更多详情here

使用any 而不是unknown 作为let example: Example&lt;unknown&gt;; 的类型。

应该是这样的:

let example: Example&lt;any&gt;;.

想了解更多关于两者的区别,可以阅读here的大量样例。

【讨论】:

  • 感谢您的帮助!您在代码中的哪个位置建议我将 unknown 分配给其他类型?据我所知,我只是将Example&lt;string&gt;Example&lt;number&gt; 分配给Example&lt;unknown&gt;,而不是相反。任何类型都可以分配给unknown
  • 您使用的是严格:true。确实可以将任何类型分配给未知,但在您的场景中,您启用了严格。如果启用了严格,则函数类型参数会进行逆变检查。简单来说,如果 A extends B 为真,您应该能够将 A 用作 B。如果不能,则 A extends B 不正确。因此,即使字符串可分配给未知数,您也不能将未知数分配给字符串,因此会出现错误。在 any 中,您可以将字符串分配给 any,反之亦然。因此解决方案。
猜你喜欢
  • 1970-01-01
  • 2020-07-28
  • 2021-10-28
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 2022-11-11
  • 2018-09-19
相关资源
最近更新 更多