打字稿类型 'string' 不可分配给类型 'never'。错误
Typescript Type 'string' is not assignable to type 'never'. error
我想做的事情很简单
在下面的例子中,
interface InterfaceA { a: string, b: number }
interface InterfaceB { c: keyof InterfaceA }
const testMethod = (test: InterfaceB) => {
const TestObject: InterfaceA = { a: '', b: 1 }
TestObject[test.c] =
}
导致“类型 'any' 不可分配给类型 'never'”错误。
我认为 test.c 可以在 TestObject 中分配,因为 c 是接口 A 的键。
我怎样才能使事情正常进行?
您收到此错误是因为 test.c
的类型不能比 keyof InterfaceA
更窄。换句话说,如果我们尝试分配给 TestObject[test.c]
,打字稿将无法确定我们是否需要分配 string
或 number
。所以它确定类型必须同时是所有有效类型,在本例中为number & string
。但是,任何值都不能同时是 number
和 string
,因此结果类型最终为 never
(参见 this playground 示例)。
我们可以通过帮助打字稿缩小 test.c
的实际类型来解决这个问题,如下所示:
interface InterfaceA {
a: string,
b: number
}
interface InterfaceB {
c: keyof InterfaceA
}
const testMethod = (test: InterfaceB) => {
const TestObject: InterfaceA = { a: '', b: 1 }
switch (test.c) {
case 'a':
TestObject[test.c] = 'foo';
break;
case 'b':
TestObject[test.c] = 42;
break;
}
}
我想做的事情很简单
在下面的例子中,
interface InterfaceA { a: string, b: number }
interface InterfaceB { c: keyof InterfaceA }
const testMethod = (test: InterfaceB) => {
const TestObject: InterfaceA = { a: '', b: 1 }
TestObject[test.c] =
}
导致“类型 'any' 不可分配给类型 'never'”错误。
我认为 test.c 可以在 TestObject 中分配,因为 c 是接口 A 的键。
我怎样才能使事情正常进行?
您收到此错误是因为 test.c
的类型不能比 keyof InterfaceA
更窄。换句话说,如果我们尝试分配给 TestObject[test.c]
,打字稿将无法确定我们是否需要分配 string
或 number
。所以它确定类型必须同时是所有有效类型,在本例中为number & string
。但是,任何值都不能同时是 number
和 string
,因此结果类型最终为 never
(参见 this playground 示例)。
我们可以通过帮助打字稿缩小 test.c
的实际类型来解决这个问题,如下所示:
interface InterfaceA {
a: string,
b: number
}
interface InterfaceB {
c: keyof InterfaceA
}
const testMethod = (test: InterfaceB) => {
const TestObject: InterfaceA = { a: '', b: 1 }
switch (test.c) {
case 'a':
TestObject[test.c] = 'foo';
break;
case 'b':
TestObject[test.c] = 42;
break;
}
}