Keyof 接口类型 'string' 不可分配给类型 'never'.ts(2322) Typescript

时间:2021-07-22 15:22:43

标签: typescript

我在 Typescript 中有一个简单的函数:

const updateItem = (key: keyof IDevice, val: string | number, i: number) => {
    const devices = [...formData.devices];

    const device = devices[i];

    // @ts-ignore
    device[key] = val;

    devices[i] = device;

    setFormData({ ...formData, devices });
};

智能设备:

export interface IDevice {
    name: string;
    width: number;
    height: number;
    userAgentString: string;
}

表单数据的类型:

interface FormState {
    name: string;
    description: string;
    devices: IDevice[];
}

我看到的错误是这样的:

<块引用>

输入'字符串| number' 不能分配给类型 'never'。
类型 'string' 不可分配给类型 'never'.ts(2322)

请帮助我,因为我不是 Typescript 的专家。

1 个答案:

答案 0 :(得分:1)

我能够更改您的函数定义以使其正常工作:

function updateItem<K extends keyof IDevice>(key: K, val: IDevice[K], i: number) {
    const devices = [...formData.devices];

    const device = devices[i];

    device[key] = val;

    devices[i] = device;

    setFormData({ ...formData, devices });
}

通过提取键类型并使其通用,TypeScript 可以更好地发挥作用。它还具有以下优点,例如updateItem('height', 'string', 0) 将产生 TS 错误,因为它需要 number 字段的 height

TypeScript Playground