我在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
方法?
答案 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
}
希望有所帮助;祝你好运!