使用泛型指定返回值的类型

时间:2018-02-23 18:45:26

标签: typescript generics google-chrome-extension typescript2.0 typescript-generics

我在Angular服务上有这个方法:

 getFromSyncStorage(key: string): Promise<Object | LastErrorType> {
    return new Promise(function (resolve, reject) {
      chrome.storage.sync.get(key, function (v: Object) {
        if (chrome.runtime.lastError) {
          return reject(chrome.runtime.lastError);
        }
        resolve(v && v[key]);
      });
    });
  }

请注意LastErrorType

export type LastErrorType = typeof chrome.runtime.lastError;

这是问题所在,有时我传递一个键,我知道“return”类型将是一个数组,例如:

getAllRunHistory() {
    return this.cds.getFromSyncStorage('my-special-key');
}

但如果我这样做:

getAllRunHistory() : Promise<Array<any>>{
    return this.cds.getFromSyncStorage('my-special-key');
}

tsc会抱怨并说回复类型不能分配给Promise<Array<any>>

如何使用泛型,以便可以正确输入此通用getFromSyncStorage方法?

1 个答案:

答案 0 :(得分:1)

您可以使用泛型来完成此操作。创建一个表示从键到值类型的映射的类型。在你的情况下,它是这样的:

type SyncStorageMap = {
    "my-special-key": Array<any>,
    [k: string]: Object // everything else
}

然后,输入您的方法:

getFromSyncStorage<K extends keyof SyncStorageMap>(
  key: K
): Promise<SyncStorageMap[K] | LastErrorType> {
   // impl
}

请注意,如果编译器无法验证"my-special-key"是否与Array<any>对应,则可能必须在该方法的实现中使用类型断言。

然后这段代码:

getAllRunHistory() {
    return this.cds.getFromSyncStorage('my-special-key');
}

将会返回Promise<Array<any> | LastErrorType>。这可能是你想要的,除非你确定你不会得到LastErrorType,在这种情况下你可以做这样的事情:

type SyncStorageMap = {
    "my-special-key": Array<any>, // no error
    [k: string]: Object | LastErrorType // maybe error
}

getFromSyncStorage<K extends keyof SyncStorageMap>(
  key: K
): Promise<SyncStorageMap[K]> {
   // impl
}

希望有所帮助;祝你好运!