javascript - 为什么这段代码说 Type 'number' 不能分配给 type 'never'
问题描述
我正在尝试创建一个名为的字符串构建函数addToCache
,该函数的参数由一个名为的接口定义Payloads
因此,基于从被enum
调用的字符串注册的键码MyStringsTest
,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'
我试图理解为什么,但我找不到原因
这是游乐场
解决方案
通过为缓存创建单独的类型别名来帮助打字稿就可以了!
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}`)
推荐阅读
- haskell - 如何使用 Shake 分配 PTY?
- javascript - 在第 n 个而不是第一个使用 async 和 await ?
- excel - 过滤表格时如何在 IE(非默认浏览器)中使 Excel 打开超链接
- libreoffice-calc - 在 Starbasic 宏中,在 LibreCalc 中,我无法将字符串作为表达式传递
- php - 如何在 WordPress 仪表板的管理栏中排列列?
- c++ - 如果函数会返回一个指向 char 数组的指针而我不会使用它怎么办?
- node.js - mocha 和 chai 测试期间的 Node.js api 端点超时
- rendering - HTML css - 谷歌浏览器和边缘是一个像素
- linux - 在添加从 RPM 移植的 pkg 后,JFrog 工件和 MergeList /var/lib/apt/lists "(NewVersion2)" 的问题
- android - Android Studio:等待设备时出错:AVD Pixel_3_API_24 的模拟器进程已终止。在配备 M1 芯片的 Mac Book Pro 上