Typescript:根据输入值返回函数类型(枚举)

2024-01-31

我将一些设置存储到本地存储中,当我从存储中获取(并且最好也插入)值时,我想输入响应。

据我所知,最好的方法似乎是使用函数重载。这就是我现在所拥有的并且它有效:

export enum SettingsKey {
  hasOnboarded = 'hasOnboarded',
  phoneNumber = 'phoneNumber'
}

export async function getSetting(storage: Storage, key: SettingsKey.phoneNumber): Promise<string>
export async function getSetting(storage: Storage, key: SettingsKey.hasOnboarded): Promise<boolean>
export async function getSetting(storage: Storage, key: any) {
  return storage.get(key)
}

我不喜欢这个解决方案的一点是,可能会忘记将枚举中的新元素添加到重载类型定义中。有没有办法强制处理所有枚举值?或者是否有更好的方法来做到这一点?

我认为这将是一件简单的事情,从价值映射hasOnboarded返回类型boolean等等,但这显然不是那么容易。

在我看来就像条件类型 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html#conditional-types可能会解决这个问题,但我无法完全理解它是如何工作的。

我也看到了this https://medium.com/@KevinBGreene/typescript-enums-and-polymorphism-with-type-matching-fc3dc74b031c方法,但这似乎有点太多的开销。

任何见解将不胜感激!


您可以使用额外的类型在枚举和承诺返回类型之间进行映射。然后我们添加一个通用参数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> {
   ///...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript:根据输入值返回函数类型(枚举) 的相关文章

随机推荐