【问题标题】:How to infer generic type from an optional parameter in a constructor如何从构造函数中的可选参数推断泛型类型
【发布时间】:2021-08-06 22:46:42
【问题描述】:

我试图在构造函数中有一个可选参数,其类型被推断为属性的类型。不幸的是,当参数没有传递时,Typescript 会判断类型是“未知”,而不是推断类型是“未定义”:

class Example<Inner> {
  inner: Inner;

  constructor(inner?: Inner) {
    if (inner) {
      this.inner = inner;
    }
  }
}

const a = new Example('foo'); // const a: Example<string>
const b = new Example(); // const b: Example<unknown>

有没有办法解决这个问题而不必指定泛型类型或参数?

我尝试使用默认值:constructor(inner: Inner = undefined) {,但随后出现错误:

类型“未定义”不能分配给类型“内部”。 'Inner' 可以用与 'undefined'.ts(2322) 无关的任意类型实例化`

【问题讨论】:

  • 试试class Example&lt;Inner = undefined&gt; { inner?: Inner; ...?
  • 是的,解决了!想把它写成答案吗?
  • 顺便说一句,我建议不要有条件地初始化该属性。相反,将其声明为 inner: Inner | undefined; 而只是 this.inner = inner;
  • 我也喜欢这样,但它不起作用。在这种情况下,inner 的类型为 undefined,但 Inner 不会被推断为 undefined

标签: javascript typescript


【解决方案1】:

= undefined 添加到泛型类型解决了这个问题:

class Example<Inner = undefined> {
  inner: Inner;

  constructor(inner?: Inner) {
    if (inner) {
      this.inner = inner;
    }
  }
}

const a = new Example('foo'); // const a: Example<string>
const b = new Example(); // const b: Example<undefined>

感谢Nadia Chibrikovacomments的建议:

试试 class Example { inner?: Inner; ...?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 2020-10-17
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    相关资源
    最近更新 更多