为什么这段代码说 Type 'number' is not assignable to type 'never'

Why is this code saying Type 'number' is not assignable to type 'never'

我正在尝试创建一个名为 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

通过为缓存创建单独的类型别名来稍微帮助 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
}

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}`)