如何解决“类型‘字符串’不可分配给类型‘从不’”?

FLi*_*ter 15 typescript

我试图从另一个对象/类型中获取一个新的对象/类型,但出现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";
}
*/
Run Code Online (Sandbox Code Playgroud)

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

pqn*_*net 29

问题在于表达式result[key]具有 type 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;
Run Code Online (Sandbox Code Playgroud)