gpt4 book ai didi

typescript - 为什么我的 getter/setter 没有在 TypeScript 中编译?

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

我有一个定义了以下 getter/setter 的类:

class ConfigStoreController {
get debugMode() {
return (async () => await this.GetConfigParameter("debugMode"))();
}

set debugMode(value: string) {
(async () => await this.SetConfigParameter("debugMode", value))();
}

private async GetConfigParameter(parameter: string) {
return await RX.Storage.getItem(parameter);
}

private async SetConfigParameter(param: string, value: string) {
return await RX.Storage.setItem(param, value);
}
}

export default new ConfigStoreController();

getter因为setter被标记为不正确,也就是说,如果去掉了setter,那么getter就OK了。

错误如下:

return (async () => await this.GetConfigParameter("debugMode"))(); error TS2322: Type 'Promise' is not assignable to type 'string'.

需要说明的是,单独使用 getter 可以很好地编译:

get debugMode() {
return (async () => await this.GetConfigParameter("debugMode"))();
}

我的代码有什么问题?

最佳答案

由于您的 getter 包含一个异步操作,因此无法让它直接重新运行 string .如果将异步操作包装在匿名函数中并不重要,该函数调用将返回 Promise<string>。 .这意味着属性的类型将为 Promise<string>

getter 单独工作,因为属性类型将是 Promise<string>这不是问题。如果您还有一个 setter 并且 setter 的参数与 get 的返回类型不同,它将停止工作。 .

您可以创建 Promise<string> 属性相反。

class ConfigStoreController {
GetConfigParameter(p: string): Promise<string> {
return Promise.resolve(p)
}
SetConfigParameter(p: string, value: string): Promise<void> {
return Promise.resolve(void 0)
}
get debugMode() {
return this.GetConfigParameter("debugMode");
}

set debugMode(value: Promise<string>) {
// There is no way to wait for this operation to finish from the outside, this might be an issue
// Also unhandled errors from the anonymous method are not handled and are not propagated to the caller, since the set is async
(async () => this.SetConfigParameter("debugMode", await value))();
}
}

更好的解决方案可能是保留 setter/getter 并使用 set方法代替:

class ConfigStoreController {
GetConfigParameter(p: string): Promise<string> {
return Promise.resolve(p)
}
SetConfigParameter(p: string, value: string): Promise<void> {
return Promise.resolve(void 0)
}
get debugMode() {
return this.GetConfigParameter("debugMode");
}

async setDebugMode(value: string) {
this.SetConfigParameter("debugMode", await value)
}
}

关于typescript - 为什么我的 getter/setter 没有在 TypeScript 中编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53393200/

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