【问题标题】:Typescript not inferring dynamic key for object打字稿不推断对象的动态键
【发布时间】:2020-12-05 00:58:52
【问题描述】:

我有一个简单的 redux 操作:

export interface UpdateUserSettingsPayloadType {
  videoInput?: MediaDeviceInfo;
  audioInput?: MediaDeviceInfo;
  audioOutput?: MediaDeviceInfo;
}

export const updateUserSettings = (
  payload: UpdateUserSettingsPayloadType
): UserSettingsActionTypes => {
  return {
    type: UPDATE_USER_SETTINGS,
    payload,
  };
};

我正在使用一个对象将正确的类型从 MediaDeviceKind 映射到我的状态键,

// note `type` is type MediaDeviceKind = "audioinput" | "audiooutput" | "videoinput"

const typeMap = {
 audioinput: "audioInput",
 audiooutput: "audioOutput",
 videoinput: "videoInput",
};

dispatch(
  updateUserSettings({
    [`${typeMap[type]}`]: "a string", // <- incorrect
  })
);

只有当我明确声明 audioInputvideoInput 作为 updateUserSettings 参数对象的键时,它才会显示错误。

dispatch(
  updateUserSettings({
    [`${typeMap[type]}`]: "I should error", // in
    audioInput: "i do error",
  })
);

更新 1

我意识到密钥被推断为[x: string]

当我真正需要它时推断为videoInput | audioInput | audioOutput

这是我除了错误之外的:

【问题讨论】:

    标签: typescript redux react-redux


    【解决方案1】:

    好的,我不确定我是否理解正确?但是您正在尝试键入验证 mediadevicekind,这现在不会发生,因为它将映射值解释为字符串。尝试将“as const”放在地图后面,它会将它们解释为实际的文字。

    编辑:好的,所以我想我现在明白你想要什么了:

    https://www.typescriptlang.org/play?#code/PTAEEYDpQQwZ1ASVAVwHYBMCmAnOAXGTAGlAHctyj9R8B7UACxgDdL9HKWYAbFLBJxxZS8UAGssATwQAzOjlqdaAmnQBGAKwBQAYzpoCtKQAcsAWRgnQAXlABvbbBQYAlnVdoTKfAC5QAEQwLu6IXj4BxE7BbnR0Pt5+gTHuAPIJEVGgLK7YHuFJATl5YYmR2gC+sAj6hvjaDbVG+KaUdgDkKfmJ7aANnvi4sjC6lIgAKqrjrQ5OzrGlPv6OoKvGZv4EOJ4A5llr2DmjiBib+NtoO3MVlQ0goHCM8TwYaDS4OAqgALQqRq4ITyyD67JTsGZCShiKTxWDCUBoOg0eBwVw7NCgr66eD4XbQRA0IG4QE0eigdSUezzUIFM4XHYAblAVTIjFcukYoABoG2O0Y+EgegMzVUtlmqwA2i0zJYTFLWgBdBX+dqcHg8Oi9e6PZ4YUAfBS3O5gABM0AA6pQyNRaAxdMIYINYOtKLJPgBbJR0OBcXj8BCOh6DaxQUAAZQYFFA9qwjqhoHdVjMeul7GYNCjwjgdB4bC57vdWDcjp4UltzvQ7jQoDosmSIToi3wAQAPkEG+l8GU28UsI2CgFtPd+V24L4QGRJ5BU3B7a4TPgeEQdpAFDtgBg6Lo4MBmJh1HFxMAYBhuGhRhhvjPIPz3TwfgA+BNJosuuDaVOgADS0jgAB5xifOwVlACUAAUuWrSQYTrcZlVAcZwIVBlKglaDawQhVjVAABmaB4kUSsDAAQg-GYm2mMwEDsH8ZD-VMMNTWUH2wjhuR1FAXn1HBPhwbCABZoGxEUCBNcthAARxQVwszBCRfxrOsCNQDESKFOo-nwE1-DAmAcFxXg-ypNDpEgpACkogR4PMItXBgAARLAjiwMJ5GZIDxVApirHlMwlRVNUNV6UBtSeTi9QNPibn6N4hhGMYAFUTAwOMEp9HAwywfBcUuOBdKkDUT083t+0SAB+fwbOLRznNcugUNWLomwq0Aqrsmr2RctB5Aa6k6E7crKtshynM6uqUOipoaBQZLUvSzLst2ajQAAChMGACroE9-EQJKUsGNLcAWnKdjyjbCowABKWwnxApocywSANR2Nbzq2q6jRm-asEOjKspOuAVsGAhLu0L65qO-6lqB1QTUuoA

    但是 -> 你为什么不这样做: https://www.typescriptlang.org/play?#code/FDAuE8AcFMAIEkCqkAmBDU1EGdoCcBlaUUASwDsBzbABTXABsB7NFWAXlgG9hZYBtANbRwsCrACy0FKTQARaADdSAY2gBpCigC6AfgBck6bIXK18cgDMmwAL4gVTctlCxMLw0lQYsuQsTIqWnpmVg5uXgEIGAk0SH5o6G1tQwByAAtoBmZUvgB6PNhsdKYAVwY2fDwmPDsHJxdYUu9MHHwiEgpqcIAKSBCWFE9kdFa-DsDqOkZBgEoOAD4IvkdnJgZoADpmSj6B1lm64GbR33aAruwe91BDoA

    【讨论】:

    • 嘿 Michiel,我已经用截图更新了我的问题,以便更详细地解释。让我知道这是否有帮助。谢谢。
    • TS v4.1.2 使用 as const 时推断密钥:typescriptlang.org/play?#code/…
    • 您好 Michiel,请查看我上面的链接,显示我的问题所在。感谢您的帮助
    • @KarlTaylor - 查看修改后的答案
    猜你喜欢
    • 1970-01-01
    • 2020-04-02
    • 2020-08-27
    • 2019-10-27
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2018-09-19
    相关资源
    最近更新 更多