将 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[]
,它是一个CompositeNode
s 的数组,而不是[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”