gpt4 book ai didi

typescript - TypeScript 映射类型的乐趣和挫折

转载 作者:搜寻专家 更新时间:2023-10-30 21:08:28 24 4
gpt4 key购买 nike

问题介绍

我正在努力为用 TypeScript 编写的特定函数开发强类型...

为了便于说明,假设我在机动车辆部工作,并且有一个函数 registerVehicles,它可以接受按名称组织的许多车辆的注册详细信息,并返回每辆车的牌照。

interface RegistrationDetails {
transmission?: 'manual' | 'automatic';
wheelCount?: number;
horsePower?: number;
}

const licensePlates = registerVehicles({
sportsCar: {
transmission: 'manual',
wheelCount: 4,
horsePower: 762
},
motorBike: {
transmission: 'manual',
wheelCount: 2
},
hoverBoard: {
// All registration details are optional
}
});

该函数返回一个对象,其中包含每辆车的名称及其新注册的车牌:

expect(licensePlates).to.eql({
sportsCar: 'ABCD-1234',
motorBike: 'SPDY-5678',
hoverBoard: 'BTTF-2'
});

该函数存在并且运行良好,问题在于如何强类型化

解决方案必须满足以下条件:

  1. 变量 licensePlates 应该根据函数的结果隐式键入。

  2. 尝试传递不存在的注册详细信息应该会在编译时出错。

    registerVehicles({
    car: {
    cowPower: 500 // <-- Spelling mistake, should be horsePower
    }
    })
  3. 尝试访问您未注册的车辆的车牌应该在编译时出错:

    const licensePlates = registerVehicles({
    ferrari: {
    horsePower: 562
    }
    });

    alert(licensePlates.furrari); // <-- Spelling mistake, should be ferrari
  4. TypeScript 应该知道每个牌照在编译时都是一个字符串

    const licensePlates = registerVehicles({
    ferrari: {}
    });

    alert(licensePlates.ferrari * 5); // <-- Error, you can't multiple a string

我已经接近了,但我尝试的每一个解决方案最终都无法满足至少一个上述要求。帮助我 Stack Overflow 社区,你是我唯一的希望!

最佳答案

实用程序类型“Record”可以满足您的需求。使用它,您可以将动态属性从一种类型映射到另一种类型。 ( Try it in the Playground ):

function registerVehicles<K extends string>(p: Record<K, RegistrationDetails> ):  Record<K, string> { 
return null;
}

K 类型将是字符串文字类型,例如。 “跑车” | “摩托车” | “悬浮板”

更新:没有很好的记录。但这里是a link to the Documentation我找到了a example在这里。

关于typescript - TypeScript 映射类型的乐趣和挫折,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45657779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com