如何修复“类型'字符串'不可分配给类型'从不'”?

Posted

技术标签:

【中文标题】如何修复“类型\'字符串\'不可分配给类型\'从不\'”?【英文标题】:How to fix "Type 'string' is not assignable to type 'never'"?如何修复“类型'字符串'不可分配给类型'从不'”? 【发布时间】:2021-09-05 14:12:51 【问题描述】:

我正在尝试从另一个对象/类型中获取新对象/类型,但收到 Type 'string' is not assignable to type 'never' 错误

const Flags = 
  ONE: () => 'one',
  TWO: () => 'two',
  // ...
;

type createEnumType<T> = [K in keyof T]: K;
type FlagsObject = createEnumType<typeof Flags>;
type FlagsKeys = keyof FlagsObject;

const keys = Object.keys(Flags) as FlagsKeys[];
let result =  as FlagsObject;
for (const key of keys) 
  result[key] = key;// Type 'string' is not assignable to type 'never'


/*
Expected value and type:
result = 
  ONE: "ONE";
  TWO: "TWO";

*/

我将类型设置为result,那我做错了什么?为什么never在这里?

【问题讨论】:

定义数组类型,否则为never 这能回答你的问题吗? What is "not assignable to parameter of type never" error in typescript? 【参考方案1】:

问题在于表达式result[key] 的类型为never,这是一个没有值的类型。让我们看看为什么会这样:

key 的类型为 'ONE'|'TWO' result 具有 'ONE': 'ONE'; 'TWO': 'TWO' 类型,因此: result['ONE'] 的类型为 'ONE' result['TWO'] 的类型为 'TWO' result[key] 有时可能是 result['ONE'],有时是 result['TWO']。如果你想给它分配一些东西,你必须选择一个可以两者兼而有之的值。任何值不能同时为'ONE''TWO'

要执行您期望的操作,您必须更强烈地键入key,但您不能这样做,因为您必须循环。我建议您在循环内覆盖 result 的类型,以便类型在外部仍然很强大:

(result as Record<typeof key, typeof key>)[key] = key;

【讨论】:

以上是关于如何修复“类型'字符串'不可分配给类型'从不'”?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 npm 审计修复问题?

如何修复drv?

如何修复漏洞

如何修复WMI

PHP网站漏洞怎么修复 如何修补网站程序代码漏洞

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)