为什么此代码说明类型“数字"不能分配给类型“从不" [英] Why is this code saying Type 'number' is not assignable to type 'never'

查看:94
本文介绍了为什么此代码说明类型“数字"不能分配给类型“从不"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to create a string build function called addToCache and the parameters of the function is defined by an interface called Payloads

因此,根据从 Enum 注册的字符串的键码(称为 MyStringsTest ),Typescript应该使用该键码执行类型查找.

So based on the key code of the string registered from an enum called MyStringsTest, Typescript should perform a type lookup using that key code.

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

用法似乎可行,但编译器显示此错误

It looks like the usage works but the compiler shows this error

类型'number'不能分配为'never' 我试图理解原因,但找不到原因

Type 'number' is not assignable to type 'never' I tried to understand why but I can't find the reason

这是操场

推荐答案

通过为缓存创建单独的类型别名来稍微帮助打字稿就可以了!

Helping typescript a little by creating separate type alias for cache works just fine!

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真的需要枚举吗,您可以完全按照以下说明完全消除它

Bdw do you really need enum, you could very well get rid of that completely as follows

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

这篇关于为什么此代码说明类型“数字"不能分配给类型“从不"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆