如何修复"Type 'string' is not assignable to type 'never'"?



我正在尝试从另一个对象/类型获取新对象/类型,但收到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为什么在这里?

问题是表达式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;

相关内容

最新更新