Введение в проблему
Я изо всех сил пытаюсь разработать сильную типизацию для конкретной функции, написанной на 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'
});
Функция существует и отлично работает, проблема заключается в том, чтобы сделать ее строго типизированной.
Решение должно соответствовать следующим критериям:
Переменная
licensePlates
должна быть неявно типизирована из результата функции.Попытка передать регистрационную информацию, которая не существует, должна привести к ошибке во время компиляции.
registerVehicles({ car: { cowPower: 500 // <-- Spelling mistake, should be horsePower } })
Попытка получить доступ к номерному знаку транспортного средства, которое вы не зарегистрировали, должна привести к ошибке во время компиляции:
const licensePlates = registerVehicles({ ferrari: { horsePower: 562 } }); alert(licensePlates.furrari); // <-- Spelling mistake, should be ferrari
TypeScript должен знать, что каждый номерной знак является строкой во время компиляции.
const licensePlates = registerVehicles({ ferrari: {} }); alert(licensePlates.ferrari * 5); // <-- Error, you can't multiple a string
Я приблизился, но каждое решение, которое я пробую, в конечном итоге не соответствует хотя бы одному из вышеуказанных требований. Помогите мне сообщество Stack Overflow, вы моя единственная надежда!