可以使用额外的类型在枚举和承诺返回类型之间进行映射。然后我们将一个泛型参数添加到
getSettings
SettingsKey
如果映射类型不包含枚举的所有键,则函数将出错。
export enum SettingsKey {
hasOnboarded = 'hasOnboarded',
phoneNumber = 'phoneNumber'
}
type SettingsKeyReturnType = {
[SettingsKey.hasOnboarded]: boolean,
[SettingsKey.phoneNumber]: string
}
export async function getSetting<K extends SettingsKey>(storage: Storage, key: K): Promise<SettingsKeyReturnType[K]> {
return storage.get(key)
}
let a = getSetting(window.localStorage, SettingsKey.phoneNumber); // Promise<string>
let b = getSetting(window.localStorage, SettingsKey.hasOnboarded); // Promise<booelan>
// We can also define a set function in a similar way
export async function setSetting<K extends SettingsKey>(storage: Storage, key: K, value: SettingsKeyReturnType[K]): Promise<void> {
///...
}