gpt4 book ai didi

typescript - 使用 Logical 或 Typescript 4 时出现类型错误

转载 作者:行者123 更新时间:2023-12-04 17:24:26 24 4
gpt4 key购买 nike

我有一个用初始值构造的类属性:

private _httpClient: ClientInterface = new HttpURLConnectionClient();

如果在实例化类时传递了它,我想覆盖它:

class Class {
private _httpClient: ClientInterface = new HttpURLConnectionClient();

constructor(httpClient?: ClientInterface) {
if (httpClient) {
this._httpClient = httpClient // replaces existing _httpClient
}
}
}

new Class(httpClient)

我正在将此代码迁移到 TypeScript 4,并且我假设以下内容是等效的:

class Class {
private _httpClient: ClientInterface = new HttpURLConnectionClient();

constructor(httpClient?: ClientInterface) {
this._httpClient ||= httpClient // Shows ts error! But should be equivalent to this._httpClient = httpClient || this._httpClient
}
}

new Class(httpClient)

但它显示 Type 'X | undefined' 不可分配给类型 'X',如果我没有使用逻辑或,这是可以理解的。

我知道如果我这样做可以解决这个问题,但我想了解为什么上面的解决方案显示类型错误:

class Class {
private _httpClient: ClientInterface;

constructor(httpClient?: ClientInterface) {
this._httpClient = httpClient || new HttpURLConnectionClient()
}
}

new Class(httpClient)

最佳答案

您稍微误解了 short-circuiting assignment 的内容是在做。 a ||= b 等同于 a = a || b,它处理可能未定义的赋值的左侧,而不是右侧。

在您的情况下,这类似于:

this._httpClient = this._httpClient || httpClient

(编译器实际上发出了 this._httpClient || (this._httpClient = httpClient),但这样想更容易。)

你的后一个版本是相反的(a = b || a):

this._httpClient = httpClient || new HttpURLConnectionClient()
// ^ equivalent to this._httpClient

可能最简单的实现方式是使用 parameter property使用默认值:

class Class {
constructor(private _httpClient: ClientInterface = new HttpURLConnectionClient()) { }
}

关于typescript - 使用 Logical 或 Typescript 4 时出现类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64277059/

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