【发布时间】:2021-08-17 17:03:59
【问题描述】:
我有一个描述来自 BE 的数据结构的接口,并且一个类具有将该 BE 数据结构转换为我们的 FE 数据结构的方法,反之亦然,但在该打字稿期间抛出 Type 'string | number' is not assignable to type 'never'. Type 'string' is not assignable to type 'never' 错误。我该如何解决,为什么会这样?
interface BEStructure {
a?: string;
b?: number;
...
}
class FEStructure {
a: string = null;
b: number = null;
...
static convertToBE(fe: Partial<FEStructure>): BEStructure {
const be: BEStructure = {};
Object.keys(fe).forEach(key => {
switch (key) {
case 'a':
case 'b':
// My others logic
// ERROR HERE
be[key] = fe[key];
break;
default:
be[key] = fe[key];
}
});
return be;
}
}
我创建了a reproduce here
【问题讨论】:
-
您在 DB 中有一个名为
never的字段吗? never的类型是什么? -
@balderman
never是 TypeScript 类型。尚不确定为什么它会隐式发生在这里... -
其他"...is not assignable to type 'never'" 问题都没有帮助吗?
-
发生 TS 错误是因为 switch case 同时适用于 a 和 b,从而创建了一个不可能的类型条件,因为它不能同时是字符串和数字。如果将两者分开,则不会出错。
-
@Rich N fe[key] 是字符串 OR 数字,但 be[key] 需要字符串 AND 数字,因为这是分配给可能需要任一类型的属性的唯一安全方法。这只是一个 TS 错误,而不是实际的运行时问题,因此可以使用 as 断言绕过它。这是编译器的限制,它不明白 be[key] 需要的类型与 fe[key] 的类型相同。
标签: typescript