【问题标题】:Why is this code saying Type 'number' is not assignable to type 'never'为什么这段代码说 Type 'number' 不能分配给 type 'never'
【发布时间】:2020-09-12 21:47:23
【问题描述】:

我正在尝试创建一个名为 addToCache 的字符串构建函数,该函数的参数由名为 Payloads 的接口定义

因此,基于从名为 MyStringsTestenum 注册的字符串的键码,Typescript 应该使用该键码执行类型查找。

export enum MyStringsTest {
    DEPART_IN_X_MINUTE='DEPART_IN_X_MINUTE',
    A_DRIVER_IS_ASKING_FOR='A_DRIVER_IS_ASKING_FOR',
}
export interface Payloads {
    [MyStringsTest.DEPART_IN_X_MINUTE]: number,
    [MyStringsTest.A_DRIVER_IS_ASKING_FOR]: string,
}
const cache:{ [K in keyof Payloads]?: (payload: Payloads[K]) => string } = {}
function addToCache<K extends keyof Payloads>(code: K, cb: ((payload: Payloads[K]) => string)): void{
    cache[code] = cb // I have the error here Type 'number' is not assignable to type 'never'
}
addToCache(MyStringsTest.DEPART_IN_X_MINUTE, (data) => `Depart in ${data} minutes!`);
addToCache(MyStringsTest.A_DRIVER_IS_ASKING_FOR, (data) => `a driver is asking for ${data}`);

看起来用法有效,但编译器显示此错误

Type 'number' is not assignable to type 'never'我试图理解为什么但我找不到原因

这是playground

【问题讨论】:

    标签: javascript typescript types lookup


    【解决方案1】:

    通过为缓存创建单独的类型别名来帮助打字稿工作就好了!

    export enum MyStringsTest {
      DEPART_IN_X_MINUTE = 'DEPART_IN_X_MINUTE',
      A_DRIVER_IS_ASKING_FOR = 'A_DRIVER_IS_ASKING_FOR'
    }
    export interface Payloads {
      [MyStringsTest.DEPART_IN_X_MINUTE]: number
      [MyStringsTest.A_DRIVER_IS_ASKING_FOR]: string
    }
    
    type Catch = {
      [K in keyof Payloads]?: (payload: Payloads[K]) => string
    }
    
    const cache: Catch = {}
    function addToCache<K extends keyof Catch>(code: K, cb: Catch[K]): void {
      cache[code] = cb
    }
    addToCache(MyStringsTest.DEPART_IN_X_MINUTE, (data) => `Depart in ${data} minutes!`)
    addToCache(MyStringsTest.A_DRIVER_IS_ASKING_FOR, (data) => `a driver is asking for ${data}`)
    

    bdw 你真的需要枚举吗,你可以完全摆脱它,如下所示

    export interface Payloads {
      DEPART_IN_X_MINUTE: number
      A_DRIVER_IS_ASKING_FOR: string
    }
    
    type Catch = {
      [K in keyof Payloads]?: (payload: Payloads[K]) => string
    }
    
    const cache: Catch = {}
    function addToCache<K extends keyof Catch>(code: K, cb: Catch[K]): void {
      cache[code] = cb
    }
    
    addToCache('DEPART_IN_X_MINUTE', (data) => `Depart in ${data} minutes!`)
    addToCache('A_DRIVER_IS_ASKING_FOR', (data) => `a driver is asking for ${data}`)
    
    

    【讨论】:

    猜你喜欢
    • 2022-11-14
    • 2019-03-07
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多