我试图从另一个对象/类型中获取一个新的对象/类型,但出现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)
| 归档时间: |
|
| 查看次数: |
41802 次 |
| 最近记录: |