为什么我的 getter/setter 没有用 TypeScript 编译?
Why are my getter/setter not compiling in TypeScript?
我有一个 class 定义了以下 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被标记为不正确,也就是说,如果去掉后者,那么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
。如果将异步操作包装在匿名函数中并不重要,该函数调用将 return 一个 Promise<string>
。这意味着 属性 的类型将是 Promise<string>
getter 单独工作,因为 属性 类型将是 Promise<string>
这不是问题。如果您还有一个 setter 并且 setter 的参数与 get
.
的 return 的类型不同,它将停止工作
您可以改为创建 属性,即 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))();
}
}
更好的解决方案可能是保留 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)
}
}
我有一个 class 定义了以下 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被标记为不正确,也就是说,如果去掉后者,那么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
。如果将异步操作包装在匿名函数中并不重要,该函数调用将 return 一个 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))();
}
}
更好的解决方案可能是保留 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)
}
}