代码之家  ›  专栏  ›  技术社区  ›  Andreas Gassmann

Typescript:基于输入值(enum)的函数返回类型

  •  2
  • Andreas Gassmann  · 技术社区  · 7 年前

    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 等等,但显然没那么容易。

    在我看来 conditional types 也许能解决这个问题,但我不太明白它是怎么工作的。

    我也看到了 this 方法,但这似乎有点太多的开销。

    任何洞察都将不胜感激!

    1 回复  |  直到 7 年前
        1
  •  12
  •   Titian Cernicova-Dragomir    7 年前

    可以使用额外的类型在枚举和承诺返回类型之间进行映射。然后我们将一个泛型参数添加到 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> {
       ///...
    }
    
    推荐文章