函数联合的TypeScript参数转换为“never”

8zzbczxx  于 2022-11-26  发布在  TypeScript
关注(0)|答案(1)|浏览(179)

我有几个不同的接口,每个接口都包含一个名为type的属性。

interface Type1 { type: 'key1', name: string }
interface Type2 { type: 'key2', description: string, name: string }
interface Type3 { type: 'key3', cost: number }

Map接口

interface TypeMap {
   key1: Type1,
   key2: Type2,
   key3: Type3
}

和联合类型

type TypeElement = Type1 | Type2 | Type3

Map对象,分别使用每种类型的记录,函数中的每条记录都有自己的类型,就像mapping接口一样

const allTypes: { [key in keyof TypeMap]: (record: TypeMap[key]) => void } = {
   key1: (record) => {},
   key2: (record) => {},
   key3: (record) => {},
}

当我将TypeElement类型的变量传递给allTypes的回调函数时,它会给我一个错误

const func = (record: TypeElement) => {
   const cb = allTypes[record.type]
   return cb(record)
}

这里cb的类型是((record: Type1) => void) | ((record: Type2) => void) | ((record: Type3) => void),但是当我尝试调用它cb(record)时,它告诉cb的类型是(record: never) => void
错误为:

  • 型别'TypeElement'的参数无法指派给型别'never'的参数。交集'Type 1 & Type 2 & Type 3'已减少为'never',因为属性'type'在某些组成部分中具有恩怨的型别。型别'Type 1'无法指派给型别'never'。*
    为什么我会得到这个错误?这有什么问题?我如何将记录传递到cb而不给我一个错误?record as neveras any不是我正在寻找的解决方案!
9fkzdhlc

9fkzdhlc1#

interface Type1 { type: 'key1', name: string }
interface Type2 { type: 'key2', description: string, name: string }
interface Type3 { type: 'key3', cost: number }

interface TypeMap {
   key1: Type1,
   key2: Type2,
   key3: Type3
}

type TypeElement = Type1 | Type2 | Type3

const allTypes: { [key in keyof TypeMap]: (record: TypeMap[key]) => void } = {
   key1: (record) => {},
   key2: (record) => {},
   key3: (record) => {},
}

const func = <K extends keyof TypeMap>(record: TypeMap[K]) => {
   const cb = allTypes[record.type as K]
   return cb(record)
}

相关问题