将 null 分配给类型化变量时,Visual Studio Code 在 Typescript 代码中报告错误

Posted

技术标签:

【中文标题】将 null 分配给类型化变量时,Visual Studio Code 在 Typescript 代码中报告错误【英文标题】:Visual Studio Code reports error in Typescript code when null is assigned to a typed variable 【发布时间】:2021-07-12 23:51:56 【问题描述】:

我有如下界面:

interface CompositeNodeInterface 
  name: string;
  definer: any;
  parent: CompositeNodeInterface;
  children: [CompositeNodeInterface];

  addChild(definer: any): CompositeNodeInterface

如您所见,属性parent 被类型化为递归实现相同接口的对象,属性children 被类型化为同样递归实现相同接口的对象数组。

我有以下实现CompositeNodeInterface的类:

export default class CompositeNode implements CompositeNodeInterface 
  name: string;
  definer: any;
  parent: CompositeNode;
  children: [CompositeNode];

  constructor(definer: any) 
    switch(definer.constructor.name) 
      case 'Object':
        if ('name' in definer) 
          this.name = definer.name;
         else 
          this.name = String(Object.values(definer)[0]);
        

        break;
      default:
        this.name = definer.toString();
    

    this.definer = definer;
    this.parent = null;
    this.children = [];
  

  acceptVisit(visitor: VisitorInterface) 
    return visitor.visit(this)
  

问题是当属性parent设置为null时,VSC报如下错误:Type 'null' is not assignable to type 'CompositeNode',而当属性children设置为[]时,VSC报Type '[]' is not assignable to type '[CompositeNode]'

我读到here 说所有属性都可以为空,所以我希望这些操作是有效的。

【问题讨论】:

I read here that all attributes are nullable, so I would expect these operations to be valid. 这是8!几年前。 github.com/Microsoft/TypeScript/pull/7140 而且,你的数组应该是CompositeNode[],它是一个CompositeNodes 的数组,而不是[CompositeNode],它是一个只有一个CompositeNode 作为元素的数组。 @tkausl 非常感谢,我没有注意到这个事实。您的链接给出了解决方案。 【参考方案1】:

您不能再为每个字段分配空值或未定义值,因为:https://github.com/Microsoft/TypeScript/pull/7140

您需要将值显式设置为可为空,可能使用联合类型,例如CompositeNode | null,或者另外您可以将父级设为可选

【讨论】:

以上是关于将 null 分配给类型化变量时,Visual Studio Code 在 Typescript 代码中报告错误的主要内容,如果未能解决你的问题,请参考以下文章

no_data_found 时出现异常,我想将两个变量分配给 null

TypeScript——不能将类型“HTMLElement | null”分配给类型“HTMLElement”

TypeScript——不能将类型“HTMLElement | null”分配给类型“HTMLElement”

TypeScript——不能将类型“HTMLElement | null”分配给类型“HTMLElement”

打字稿:类型'null'不可分配给类型错误

将字符串变量分配给unsigned char变量