gpt4 book ai didi

typescript - 从只读类属性推断的类型

转载 作者:搜寻专家 更新时间:2023-10-30 20:55:56 29 4
gpt4 key购买 nike

给定以下测试类:

class Test {
private readonly testString = "hello";
private readonly testStringImplicit: string = "hello";

public constructor() {
this.testString = "world";
this.testStringImplicit = "world";
}
}

目前,Typescript 2.8.2(甚至当前的 2.9.2)会为第一个属性 testString 产生以下错误:

TS2322:类型“world”不可分配给类型“hello”。

我的问题:这是一个错误吗?

我猜不是,但我不明白,为什么readonly属性的type可以是它们的值。

谢谢你的每一个有用的答案

最佳答案

这有点令人困惑,但是您的testString 的类型不是string,而是"hello"string literal type具有字符序列 hello。你的 testStringImplicit 是显式类型的 string,所以你可以给它分配任何字符串,但是你的 testString 只允许有一个字符串文字值.

它具有该类型是因为它是readonly,并且这是您用来初始化它的字符串。如果它不是 readonly,则推断类型将是 string,但因为它是 readonlytsc 假设初始化是您要写入的唯一位置,因此为 "hello" 赋予它“最佳通用类型”,即字符串文字类型。

作为jcalz有用地指出,这是intended behavior .该链接中的相关要点:

  • The type inferred for a const variable or readonly property without a type annotation is the type of the initializer as-is.

鉴于

  • The type inferred for a let variable, var variable, parameter, or non-readonly property with an initializer and no type annotation is the widened literal type of the initializer.

“constructor”这个词没有出现在 pull request 的文本中,所以你不能在构造函数中为 testString 分配不同的值,即使你被允许根据 readonly 的规则,那里似乎没有讨论。可能会在别处讨论。

关于typescript - 从只读类属性推断的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51263813/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com