打字稿类型 '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],打字稿将无法确定我们是否需要分配 stringnumber。所以它确定类型必须同时是所有有效类型,在本例中为number & string。但是,任何值都不能同时是 numberstring,因此结果类型最终为 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;
    }
}

playground