如何修复“类型'字符串'不可分配给类型'从不'”?
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;
【讨论】:
以上是关于如何修复“类型'字符串'不可分配给类型'从不'”?的主要内容,如果未能解决你的问题,请参考以下文章