TypeScriptãçšããŠãå ç¢ã§ã¹ã±ãŒã©ãã«ãã€ã¿ã€ãã»ãŒããªã¢ããªãã£ã·ã¹ãã ãèšèšã»å®è£ ããããã®è©³çްã¬ã€ããããžã¹ãã£ã¯ã¹ãMaaSãéœåžèšç»æè¡ã«æé©ã§ãã
TypeScriptã«ãã亀éæé©åïŒã¢ããªãã£ã¿ã€ãå®è£ ã®ããã®ã°ããŒãã«ã¬ã€ã
çŸä»£ã®åæ¥ãšéœåžçæŽ»ãæŽ»çºã«çžäºæ¥ç¶ããäžçã«ãããŠã人ãã¢ãã®å¹ççãªç§»åã¯æéèŠèª²é¡ã§ããå¯éããéœåžç©ºéãç§»åããã©ã¹ãã¯ã³ãã€ã«é éãããŒã³ããã倧éžã暪æããé·è·é¢è²šç©ãã©ãã¯ã«è³ããŸã§ãäº€éææ®µã®å€æ§æ§ã¯ççºçã«å¢å ããŠããŸãããã®è€éãã¯ããœãããŠã§ã¢å·¥åŠã«ãããŠå€§ããªèª²é¡ãæèµ·ããŸããããã»ã©å€å²ã«ãããã¢ããªãã£ãªãã·ã§ã³ãã€ã³ããªãžã§ã³ãã«ç®¡çããã«ãŒãã£ã³ã°ããæé©åããã·ã¹ãã ãã©ã®ããã«æ§ç¯ããã°ããã®ã§ããããïŒãã®çãã¯ãå·§åŠãªã¢ã«ãŽãªãºã ã ãã§ãªããå ç¢ã§æè»ãªãœãããŠã§ã¢ã¢ãŒããã¯ãã£ã«ãããŸããããã«TypeScriptã®ç䟡ãçºæ®ãããŸãã
ãã®å æ¬çãªã¬ã€ãã¯ãããžã¹ãã£ã¯ã¹ãMobility as a Service (MaaS)ãããã³äº€éåéã§åããœãããŠã§ã¢ã¢ãŒããã¯ãããšã³ãžãã¢ãããã¯ãªãŒãã®çæ§ã察象ãšããŠããŸããTypeScriptã䜿çšããŠãããŸããŸãªäº€éææ®µïŒããããã¢ããªãã£ã¿ã€ãããšåŒã³ãŸãïŒãã¢ãã«åããããã®åŒ·åãªã¿ã€ãã»ãŒããªã¢ãããŒããæ¢æ±ããŸããTypeScriptã®é«åºŠãªåã·ã¹ãã ãæŽ»çšããããšã§ã匷åã§ããã ãã§ãªããã¹ã±ãŒã©ãã«ã§ä¿å®æ§ãé«ãããšã©ãŒãçºçãã«ãããœãªã¥ãŒã·ã§ã³ãæ§ç¯ã§ããŸããåºæ¬çãªæŠå¿µããå®çšçãªå®è£ ãžãšé²ã¿ã次äžä»£ã®äº€éãã©ãããã©ãŒã ãæ§ç¯ããããã®éåçãæäŸããŸãã
è€éãªäº€éããžãã¯ã«TypeScriptãéžã¶çç±
å®è£ ã«å ¥ãåã«ããã®ãã¡ã€ã³ã«ãããŠTypeScriptããªãããã»ã©é åçãªéžæè¢ã§ããããçè§£ããããšãéèŠã§ãã亀éããžãã¯ã¯ãã«ãŒã«ãå¶çŽããšããžã±ãŒã¹ã«æºã¡ãŠããŸãã貚ç©ã®ç©ã¿è·ãèªè»¢è»ã«å²ãåœãŠãããäºé建ãŠãã¹ãäœãæ©ã®äžã«èªå°ããããããããªåçŽãªãšã©ãŒã§ããçŸå®äžçã«é倧ãªåœ±é¿ãäžããå¯èœæ§ããããŸããTypeScriptã¯ãåŸæ¥ã®JavaScriptã«ã¯ãªãã»ãŒããã£ããããæäŸããŸãã
- å€§èŠæš¡ãªåå®å šæ§ïŒäž»ãªå©ç¹ã¯ãæ¬çªç°å¢ã§ã¯ãªãéçºäžã«ãšã©ãŒãææã§ããããšã§ãããè»äž¡ãããæ©è¡è ãããŸãã¯ãå ¬å ±äº€éæ©é¢ã®åºéããäœã§ãããã«ã€ããŠå³æ Œãªå¥çŽãå®çŸ©ããããšã§ãã³ãŒãã¬ãã«ã§ã®éè«ççãªæäœãé²ããŸããããšãã°ãã³ã³ãã€ã©ã¯ãæ©ããŠãã人ã衚ãã¢ããªãã£ã¿ã€ãã§fuel_capacityããããã£ã«ã¢ã¯ã»ã¹ããããšãããšãããã黿¢ã§ããŸãã
- éçºè ãšã¯ã¹ããªãšã³ã¹ãšã³ã©ãã¬ãŒã·ã§ã³ã®åäžïŒå€§èŠæš¡ã§ã°ããŒãã«ã«åæ£ããããŒã ã§ã¯ãæç¢ºã§èªå·±ææžåãããã³ãŒãããŒã¹ãäžå¯æ¬ ã§ããTypeScriptã®ã€ã³ã¿ãŒãã§ãŒã¹ãšåã¯ãçããããã¥ã¡ã³ããšããŠæ©èœããŸããTypeScriptããµããŒããããšãã£ã¿ãŒã¯ãã€ã³ããªãžã§ã³ããªèªåè£å®ããã³ãªãã¡ã¯ã¿ãªã³ã°ããŒã«ãæäŸããéçºè ã®çç£æ§ãåçã«åäžãããæ°ããããŒã ã¡ã³ããŒãè€éãªãã¡ã€ã³ããžãã¯ãçè§£ããããããŸãã
- ã¹ã±ãŒã©ããªãã£ãšä¿å®æ§ïŒäº€éã·ã¹ãã ã¯é²åããŸãã仿¥ãèªåè»ããã³ã管çããŠããŠããææ¥ã«ã¯é»åã¹ã¯ãŒã¿ãŒãé
éãããŒã³ãèªåŸåãããã«ãªããããããŸãããé©åã«èšèšãããTypeScriptã¢ããªã±ãŒã·ã§ã³ã¯ãèªä¿¡ãæã£ãŠæ°ããã¢ããªãã£ã¿ã€ãã远å ã§ããŸããã³ã³ãã€ã©ã¯ããªãã®ã¬ã€ããšãªããæ°ããã¿ã€ããåŠçããããã«æŽæ°ããå¿
èŠãããã·ã¹ãã ã®ãã¹ãŠã®éšåãææããŸããããã¯ãæ¬çªç°å¢ã®ãã°ã«ãã£ãŠå¿ãããã
if-elseãããã¯ãçºèŠãããããã¯ããã«åªããŠããŸãã - è€éãªããžãã¹ã«ãŒã«ã®ã¢ããªã³ã°ïŒäº€éã¯é床ãšè·é¢ã ãã§ã¯ãããŸãããè»äž¡ã®å¯žæ³ãééå¶éãéè·¯èŠå¶ãé転æéãéè¡æãç°å¢èŠå¶åºåãªã©ãé¢äžããŸããTypeScriptã®åã·ã¹ãã ãç¹ã«å€å¥å ±çšäœãã€ã³ã¿ãŒãã§ãŒã¹ãªã©ã®æ©èœã¯ããããã®å€é¢çãªã«ãŒã«ãã³ãŒãå ã§çŽæ¥è¡šçŸããã衚çŸåè±ãã§ãšã¬ã¬ã³ããªæ¹æ³ãæäŸããŸãã
ã³ã¢ã³ã³ã»ããïŒãŠãããŒãµã«ãªã¢ããªãã£ã¿ã€ãã®å®çŸ©
ã·ã¹ãã æ§ç¯ã®æåã®ã¹ãããã¯ãå ±éèšèªã確ç«ããããšã§ãããã¢ããªãã£ã¿ã€ãããšã¯äœã§ããããïŒããã¯ã亀éãããã¯ãŒã¯å ã®ãã¹ã暪æã§ãããããããšã³ãã£ãã£ã®æœè±¡çãªè¡šçŸã§ããåãªãè»äž¡ä»¥äžã®ååšã§ãããã«ãŒãã£ã³ã°ãã¹ã±ãžã¥ãŒãªã³ã°ãæé©åã«å¿ èŠãªãã¹ãŠã®å±æ§ãå«ãå æ¬çãªãããã¡ã€ã«ã§ãã
ãŸãããã¹ãŠã®ã¢ããªãã£ã¿ã€ãã§ã¯ãªãã«ããŠããã»ãšãã©ã®ã¢ããªãã£ã¿ã€ãã«å ±éããã³ã¢ããããã£ãå®çŸ©ããããšããå§ããŸãããããã®å±æ§ã¯ãç§ãã¡ã®ãŠãããŒãµã«ã¢ãã«ã®åºç€ã圢æããŸãã
ã¢ããªãã£ã¿ã€ãã®äž»èŠå±æ§
å ç¢ãªã¢ããªãã£ã¿ã€ãã¯ã以äžã®ã«ããŽãªã®æ å ±ãã«ãã»ã«åããå¿ èŠããããŸãã
- èå¥ãšåé¡ïŒ
idïŒäžæã®æååèå¥åïŒäŸïŒ'CARGO_VAN_XL'ã'CITY_BICYCLE'ïŒãtypeïŒåºç¯ãªã«ããŽãªåãã®ããã®åé¡åïŒäŸïŒ'VEHICLE'ã'MICROMOBILITY'ã'PEDESTRIAN'ïŒãã¿ã€ãã»ãŒããªåãæ¿ãã«äžå¯æ¬ ã§ããnameïŒäººéãèªããååïŒäŸïŒãç¹å€§è²šç©ãã³ãïŒã
- ããã©ãŒãã³ã¹ãããã¡ã€ã«ïŒ
speedProfileïŒæ©è¡ã®å Žåã®åçŽãªå¹³åé床ïŒäŸïŒ5 km/hïŒããéè·¯ã®çš®é¡ãåŸé ã亀éç¶æ³ãèæ ®ããè€éãªé¢æ°ãªã©ãèããããŸããè»äž¡ã®å Žåãå éããã³æžéã¢ãã«ãå«ãããšããããŸããenergyProfileïŒãšãã«ã®ãŒæ¶è²»ãå®çŸ©ããŸããããã¯ãçè²»ïŒãªããã«/100kmãŸãã¯MPGïŒãããããªãŒå®¹éãšæ¶è²»éïŒkWh/kmïŒããããã¯æ©è¡ããµã€ã¯ãªã³ã°ã«ããã人éã®ã«ããªãŒæ¶è²»ãã¢ãã«åããããšãã§ããŸãã
- ç©ççå¶çŽïŒ
dimensionsïŒã¡ãŒãã«ãªã©ã®æšæºåäœã§ã®heightãwidthãlengthãå«ããªããžã§ã¯ããæ©ããã³ãã«ãçãéã®ã¯ãªã¢ã©ã³ã¹ãã§ãã¯ã«äžå¯æ¬ ã§ããweightïŒããã°ã©ã ã§ã®grossWeightãšaxleWeightã®ãªããžã§ã¯ããééå¶éã®ããæ©ãéè·¯ã«äžå¯æ¬ ã§ãã
- éçšããã³æ³çå¶çŽïŒ
accessPermissionsïŒå©çšã§ããã€ã³ãã©ã®çš®é¡ãå®çŸ©ããã¿ã°ã®é åãŸãã¯ã»ããïŒäŸïŒ['HIGHWAY', 'URBAN_ROAD', 'BIKE_LANE']ïŒãprohibitedFeaturesïŒé¿ããã¹ããã®ã®ãªã¹ãïŒäŸïŒ['TOLL_ROADS', 'FERRIES', 'STAIRS']ïŒãspecialDesignationsïŒå±éºç©ã瀺ããHAZMATããæž©åºŠç®¡ç貚ç©ã瀺ããREFRIGERATEDããªã©ãç¬èªã®ã«ãŒãã£ã³ã°ã«ãŒã«ã䌎ãç¹å¥ãªåé¡ã®ããã®ã¿ã°ã
- çµæžã¢ãã«ïŒ
costModelïŒcostPerKilometerãcostPerHourïŒé転æçµŠäžãè»äž¡æ©èã®ããïŒãfixedCostïŒ1åã®ç§»åã®ããã®åºå®è²»çšïŒãªã©ãã³ã¹ããå®çŸ©ããæ§é ã
- ç°å¢ãžã®åœ±é¿ïŒ
emissionsProfileïŒç°å¢ã«åªããã«ãŒãã£ã³ã°æé©åãå¯èœã«ãããããco2GramsPerKilometerãªã©ã®æåºéã詳现ã«èšè¿°ãããªããžã§ã¯ãã
TypeScriptã«ãããå®è·µçãªå®è£ æŠç¥
次ã«ããããã®æŠå¿µãã¯ãªãŒã³ã§ä¿å®ããããTypeScriptã³ãŒãã«å€æããŸããããã€ã³ã¿ãŒãã§ãŒã¹ãåããããŠãã®çš®ã®ã¢ããªã³ã°ã«æã匷åãªTypeScriptã®æ©èœã®1ã€ã§ããå€å¥å ±çšäœãçµã¿åãããŠäœ¿çšããŸãã
ã¹ããã1ïŒããŒã¹ã€ã³ã¿ãŒãã§ãŒã¹ã®å®çŸ©
ãŸããå ã»ã©å®çŸ©ããæ§é åããããã£ã®ã€ã³ã¿ãŒãã§ãŒã¹ãäœæããŸããå éšã§æšæºåäœç³»ïŒã¡ãŒãã«æ³ãªã©ïŒã䜿çšããããšã¯ã倿ãšã©ãŒãé¿ããããã®ã°ããŒãã«ãªãã¹ããã©ã¯ãã£ã¹ã§ãã
äŸïŒããŒã¹ããããã£ã€ã³ã¿ãŒãã§ãŒã¹
// ãã¹ãŠã®åäœã¯å
éšçã«æšæºåãããŠããŸããäŸïŒã¡ãŒãã«ãkgãkm/h
interface IDimensions {
height: number;
width: number;
length: number;
}
interface IWeight {
gross: number; // ç·éé
axleLoad?: number; // ãªãã·ã§ã³ãç¹å®ã®éè·¯èŠå¶çš
}
interface ICostModel {
perKilometer: number; // è·é¢åäœãããã®ã³ã¹ã
perHour: number; // æéåäœãããã®ã³ã¹ã
fixed: number; // 1åã®ç§»åãããã®åºå®ã³ã¹ã
}
interface IEmissionsProfile {
co2GramsPerKilometer: number;
}
次ã«ããã¹ãŠã®ã¢ããªãã£ã¿ã€ããå ±æããããŒã¹ã€ã³ã¿ãŒãã§ãŒã¹ãäœæããŸããå€ãã®ããããã£ã¯ããã¹ãŠã®ã¿ã€ãã«é©çšãããããã§ã¯ãªãããããªãã·ã§ã³ã§ããããšã«æ³šæããŠãã ããïŒäŸïŒæ©è¡è ã«ã¯å¯žæ³ãçæã³ã¹ãããããŸããïŒã
äŸïŒã³ã¢ãšãªãIMobilityTypeã€ã³ã¿ãŒãã§ãŒã¹
interface IMobilityType {
id: string;
name: string;
averageSpeedKph: number;
accessPermissions: string[]; // äŸïŒ['PEDESTRIAN_PATH']
prohibitedFeatures?: string[]; // äŸïŒ['HIGHWAY']
costModel?: ICostModel;
emissionsProfile?: IEmissionsProfile;
dimensions?: IDimensions;
weight?: IWeight;
}
ã¹ããã2ïŒå€å¥å ±çšäœãå©çšããã¿ã€ãåºæã®ããžãã¯
å€å¥å
±çšäœã¯ãå
±çšäœå
ã®ååã«ãªãã©ã«ããããã£ïŒãå€å¥åãïŒã䜿çšããTypeScriptãäœæ¥äžã®ç¹å®ã®åãçµã蟌ããããã«ãããã¿ãŒã³ã§ããããã¯ç§ãã¡ã®ãŠãŒã¹ã±ãŒã¹ã«æé©ã§ããå€å¥åãšããŠæ©èœããmobilityClassããããã£ã远å ããŸãã
次ã«ãç°ãªãã¯ã©ã¹ã®ã¢ããªãã£ã«ã€ããŠå
·äœçãªã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ããŸãããããããããããŒã¹ã®IMobilityTypeãæ¡åŒµããç¬èªã®ããããã£ãšãæãéèŠãªmobilityClasså€å¥åã远å ããŸãã
äŸïŒç¹å®ã®ã¢ããªãã£ã€ã³ã¿ãŒãã§ãŒã¹ã®å®çŸ©
interface IPedestrianProfile extends IMobilityType {
mobilityClass: 'PEDESTRIAN';
avoidsTraffic: boolean; // å
¬åãªã©ãéãè¿éãå©çšã§ãã
}
interface IBicycleProfile extends IMobilityType {
mobilityClass: 'BICYCLE';
requiresBikeParking: boolean;
}
// é»åè»äž¡çšã®ããè€éãªå
interface IVehicleProfile extends IMobilityType {
mobilityClass: 'VEHICLE';
fuelType: 'GASOLINE' | 'DIESEL' | 'ELECTRIC' | 'HYBRID';
fuelCapacity?: number; // ãªããã«ãŸãã¯kWhåäœ
// è»äž¡ã®å Žåã寞æ³ãšééãå¿
é ãšãã
dimensions: IDimensions;
weight: IWeight;
}
interface IPublicTransitProfile extends IMobilityType {
mobilityClass: 'PUBLIC_TRANSIT';
agencyName: string; // äŸïŒãTfLãããMTAã
mode: 'BUS' | 'TRAIN' | 'SUBWAY' | 'TRAM';
}
次ã«ãããããåäžã®å
±çšäœåã«çµåããŸãããã®MobilityProfileåã¯ãã·ã¹ãã ã®ç€ç³ãšãªããŸããã«ãŒãã£ã³ã°ãæé©åãè¡ããããã颿°ã¯ããã®åã®åŒæ°ãåãå
¥ããŸãã
äŸïŒæçµçãªå ±çšäœå
type MobilityProfile = IPedestrianProfile | IBicycleProfile | IVehicleProfile | IPublicTransitProfile;
ã¹ããã3ïŒå ·äœçãªã¢ããªãã£ã¿ã€ãã€ã³ã¹ã¿ã³ã¹ã®äœæ
åãšã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ãããããå ·äœçãªã¢ããªãã£ãããã¡ã€ã«ã®ã©ã€ãã©ãªãäœæã§ããŸãããããã¯ãå®çŸ©ããã圢ç¶ã«æºæ ãããã¬ãŒã³ãªãªããžã§ã¯ãã§ãããã®ã©ã€ãã©ãªã¯ãããŒã¿ããŒã¹ãèšå®ãã¡ã€ã«ã«ä¿åãããå®è¡æã«ããŒãããããšãã§ããŸãã
äŸïŒå ·äœçãªã€ã³ã¹ã¿ã³ã¹
const WALKING_PROFILE: IPedestrianProfile = {
id: 'pedestrian_standard',
name: 'ãŠã©ãŒãã³ã°',
mobilityClass: 'PEDESTRIAN',
averageSpeedKph: 5,
accessPermissions: ['PEDESTRIAN_PATH', 'SIDEWALK', 'PARK_TRAIL'],
prohibitedFeatures: ['HIGHWAY', 'TUNNEL_VEHICLE_ONLY'],
avoidsTraffic: true,
emissionsProfile: { co2GramsPerKilometer: 0 },
};
const CARGO_VAN_PROFILE: IVehicleProfile = {
id: 'van_cargo_large_diesel',
name: '倧åãã£ãŒãŒã«è²šç©ãã³',
mobilityClass: 'VEHICLE',
averageSpeedKph: 60,
accessPermissions: ['HIGHWAY', 'URBAN_ROAD'],
fuelType: 'DIESEL',
dimensions: { height: 2.7, width: 2.2, length: 6.0 },
weight: { gross: 3500 },
costModel: { perKilometer: 0.3, perHour: 25, fixed: 10 },
emissionsProfile: { co2GramsPerKilometer: 250 },
};
ã«ãŒãã£ã³ã°ãšã³ãžã³ã«ãããã¢ããªãã£ã¿ã€ãã®é©çš
ãã®ã¢ãŒããã¯ãã£ã®çã®åã¯ãã«ãŒãã£ã³ã°ãšã³ãžã³ãªã©ã®ã³ã¢ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã§ãããã®åä»ããããã¡ã€ã«ã䜿çšãããšãã«æããã«ãªããŸããå€å¥å ±çšäœã䜿çšããããšã§ãç°ãªãã¢ããªãã£ã«ãŒã«ãåŠçããããã®ã¯ãªãŒã³ã§ç¶²çŸ çãã€ã¿ã€ãã»ãŒããªã³ãŒããèšè¿°ã§ããŸãã
ã¢ããªãã£ã¿ã€ããéè·¯ãããã¯ãŒã¯ã®ç¹å®ã®ã»ã°ã¡ã³ãïŒã°ã©ãçè«ã«ãããããšããžãïŒã暪æã§ãããã©ããã倿ããå¿
èŠããã颿°ãæ³åããŠãã ããããã®ãšããžã«ã¯ãmaxHeightãmaxWeightãallowedAccessTagsãªã©ã®ããããã£ããããŸãã
ç¶²çŸ
çãªswitchã¹ããŒãã¡ã³ãã«ããã¿ã€ãã»ãŒããªããžãã¯
MobilityProfileåã䜿çšãã颿°ã¯ãmobilityClassããããã£ã«å¯ŸããŠswitchã¹ããŒãã¡ã³ãã䜿çšã§ããŸããTypeScriptã¯ãããçè§£ããåcaseãããã¯å
ã§profileã®åãã€ã³ããªãžã§ã³ãã«çµã蟌ã¿ãŸããããã¯ã'VEHICLE'ã±ãŒã¹ã®å
éšã§ãã³ã³ãã€ã©ãæå¥ãèšãããšãªãprofile.dimensions.heightã«å®å
šã«ã¢ã¯ã»ã¹ã§ããããšãæå³ããŸãããªããªãããããIVehicleProfileã§ãããšTypeScriptãèªèããŠããããã§ãã
ããã«ãtsconfigã§"strictNullChecks": trueãæå¹ã«ããŠããå ŽåãTypeScriptã³ã³ãã€ã©ã¯switchã¹ããŒãã¡ã³ããç¶²çŸ
çã§ããããšãä¿èšŒããŸããMobilityProfileå
±çšäœã«æ°ããåïŒäŸïŒIDroneProfileïŒã远å ããããããã«å¯Ÿããcaseã远å ãå¿ããå Žåãã³ã³ãã€ã©ã¯ãšã©ãŒãçºçãããŸããããã¯ä¿å®æ§ã«ãšã£ãŠéåžžã«åŒ·åãªæ©èœã§ãã
äŸïŒã¿ã€ãã»ãŒããªã¢ã¯ã»ã·ããªãã£ãã§ãã¯é¢æ°
// RoadSegmentã¯éè·¯ã®äžéšãå®çŸ©ããåãšä»®å®
interface RoadSegment {
id: number;
allowedAccess: string[]; // äŸïŒ['HIGHWAY', 'VEHICLE']
maxHeight?: number;
maxWeight?: number;
}
function canTraverse(profile: MobilityProfile, segment: RoadSegment): boolean {
// åºæ¬çãªãã§ãã¯ïŒãã®ã»ã°ã¡ã³ãã¯äžè¬çãªã¿ã€ãã®ã¢ã¯ã»ã¹ãèš±å¯ãããïŒ
const hasAccessPermission = profile.accessPermissions.some(perm => segment.allowedAccess.includes(perm));
if (!hasAccessPermission) {
return false;
}
// 次ã«ãç¹å®ã®ãã§ãã¯ã®ããã«å€å¥å
±çšäœã䜿çšãã
switch (profile.mobilityClass) {
case 'PEDESTRIAN':
// æ©è¡è
ã«ã¯ç©ççãªå¶çŽã¯ã»ãšãã©ãªã
return true;
case 'BICYCLE':
// èªè»¢è»ã«ã¯ç¹å®ã®å¶çŽããããããããªãããããã§ã¯åçŽã«æ±ã
return true;
case 'VEHICLE':
// ããã§TypeScriptã¯`profile`ãIVehicleProfileã§ããããšãèªèããŠããïŒ
// 寞æ³ãšééã«å®å
šã«ã¢ã¯ã»ã¹ã§ããã
if (segment.maxHeight && profile.dimensions.height > segment.maxHeight) {
return false; // ãã®æ©/ãã³ãã«ã«ã¯é«ããã
}
if (segment.maxWeight && profile.weight.gross > segment.maxWeight) {
return false; // ãã®æ©ã«ã¯éããã
}
return true;
case 'PUBLIC_TRANSIT':
// å
Œ
±äº€éæ©é¢ã¯åºå®ã«ãŒãã«åŸãããããã®ãã§ãã¯ã¯ç°ãªãå¯èœæ§ããã
// ä»ã®ãšãããåºæ¬çãªã¢ã¯ã»ã¹ãããã°æå¹ãšä»®å®ãã
return true;
default:
// ãã®ããã©ã«ãã±ãŒã¹ã¯ç¶²çŸ
æ§ãåŠçããã
const _exhaustiveCheck: never = profile;
return _exhaustiveCheck;
}
}
ã°ããŒãã«ãªèæ ®äºé ãšæ¡åŒµæ§
ã°ããŒãã«ãªäœ¿çšãç®çãšããã·ã¹ãã ã¯ãé©å¿å¯èœã§ãªããã°ãªããŸãããèŠå¶ãåäœãå©çšå¯èœãªäº€éææ®µã¯ã倧éžãåœãããã«ã¯éœåžã«ãã£ãŠåçã«ç°ãªããŸããåœç€Ÿã®ã¢ãŒããã¯ãã£ã¯ããã®è€éããåŠçããã®ã«é©ããŠããŸãã
å°åå·®ãžã®å¯Ÿå¿
- 枬å®åäœïŒã°ããŒãã«ã·ã¹ãã ã«ãããäžè¬çãªãšã©ãŒã®åå ã¯ãã¡ãŒãã«æ³ïŒããã¡ãŒãã«ãããã°ã©ã ïŒãšã€ãŒãã»ãã³ãæ³ïŒãã€ã«ããã³ãïŒã®åäœã®æ··åã§ãããã¹ããã©ã¯ãã£ã¹ïŒããã¯ãšã³ãã·ã¹ãã å
šäœãåäžã®åäœç³»ïŒã¡ãŒãã«æ³ãç§åŠçãã€äžççæšæºã§ãïŒã«æšæºåããŠãã ããã
MobilityProfileã¯åžžã«ã¡ãŒãã«æ³ã®å€ã®ã¿ãå«ãã¹ãã§ããã€ãŒãã»ãã³ãæ³ãžã®ãã¹ãŠã®å€æã¯ããŠãŒã¶ãŒã®ãã±ãŒã«ã«åºã¥ããŠãã¬ãŒã³ããŒã·ã§ã³å±€ïŒAPIå¿çãŸãã¯ããã³ããšã³ãUIïŒã§è¡ãããã¹ãã§ãã - å°åèŠå¶ïŒãã³ãã³äžå¿éšã®è¶
äœæåºã¬ã¹ãŸãŒã³ïŒULEZïŒã«ããã貚ç©ãã³ã®ã«ãŒãã£ã³ã°ã¯ããããµã¹å·ã®ç°èã§ã®ã«ãŒãã£ã³ã°ãšã¯å€§ããç°ãªããŸããããã¯ãå¶çŽãåçã«ããããšã§åŠçã§ããŸãã
accessPermissionsãããŒãã³ãŒãã£ã³ã°ãã代ããã«ãã«ãŒãã£ã³ã°ãªã¯ãšã¹ãã«å°ççã³ã³ããã¹ãïŒäŸïŒcontext: 'london_city_center'ïŒãå«ããããšãã§ããŸãããšã³ãžã³ã¯ãULEZèŠä»¶ã«å¯ŸããŠè»äž¡ã®fuelTypeãemissionsProfileããã§ãã¯ãããªã©ããã®ã³ã³ããã¹ãã«åºæã®äžé£ã®ã«ãŒã«ãé©çšããŸãã - åçããŒã¿ïŒããŒã¹ãããã¡ã€ã«ãšãªã¢ã«ã¿ã€ã ããŒã¿ãçµã¿åãããããšã§ãããã€ãã¬ãŒããããããããã¡ã€ã«ãäœæã§ããŸããããšãã°ãããŒã¹ã®
CAR_PROFILEãã©ã€ã亀éããŒã¿ãšçµã¿åãããŠãç¹å®ã®æé垯ã®ç¹å®ã®ã«ãŒãã®åçãªspeedProfileãäœæã§ããŸãã
æ°ããã¢ããªãã£ã¿ã€ãã«ããã¢ãã«ã®æ¡åŒµ
ããªãã®äŒç€Ÿãé éãããŒã³ãµãŒãã¹ãéå§ããããšã決å®ãããã©ããªãã§ããããïŒãã®ã¢ãŒããã¯ãã£ã§ã¯ãããã»ã¹ã¯æ§é åãããå®å šã§ãã
- ã€ã³ã¿ãŒãã§ãŒã¹ã®å®çŸ©ïŒ
IMobilityTypeãæ¡åŒµããmaxFlightAltitudeãbatteryLifeMinutesãpayloadCapacityKgãªã©ã®ãããŒã³åºæã®ããããã£ãå«ãæ°ããIDroneProfileã€ã³ã¿ãŒãã§ãŒã¹ãäœæããŸããå€å¥åmobilityClass: 'DRONE';ãå¿ããªãã§ãã ããã - å
±çšäœã®æŽæ°ïŒ
MobilityProfileå ±çšäœåã«IDroneProfileã远å ããŸãïŒtype MobilityProfile = ... | IDroneProfile; - ã³ã³ãã€ã©ãšã©ãŒã«åŸãïŒãããéæ³ã®ã¹ãããã§ããTypeScriptã³ã³ãã€ã©ã¯ãç¶²çŸ
çã§ãªããªã£ããã¹ãŠã®
switchã¹ããŒãã¡ã³ãã§ãšã©ãŒãçæããŸããcanTraverseã®ãããªãã¹ãŠã®é¢æ°ãææãããDRONEãã±ãŒã¹ã®ããžãã¯ãå®è£ ããããã«åŒ·å¶ããŸãããã®äœç³»çãªããã»ã¹ã«ãããéèŠãªããžãã¯ãèŠèœãšãããšããªããªããæ°æ©èœå°å ¥æã®ãã°ã®ãªã¹ã¯ãåçã«è»œæžããŸãã - ããžãã¯ã®å®è£ ïŒã«ãŒãã£ã³ã°ãšã³ãžã³ã«ãããŒã³çšã®ããžãã¯ã远å ããŸããããã¯å°äžè»äž¡ãšã¯å šãç°ãªããŸããéè·¯ãããã¯ãŒã¯ã®ããããã£ã®ä»£ããã«ãé£è¡çŠæ¢åºåãæ°è±¡æ¡ä»¶ïŒé¢šéïŒãçéžå°ç¹ã®å¯çšæ§ã®ãã§ãã¯ãå«ãŸããå¯èœæ§ããããŸãã
çµè«ïŒæªæ¥ã®ã¢ããªãã£ã®ããã®åºç€æ§ç¯
亀éã®æé©åã¯ãçŸä»£ã®ãœãããŠã§ã¢å·¥åŠã«ãããæãè€éã§åœ±é¿åã®ãã課é¡ã®1ã€ã§ããç§ãã¡ãæ§ç¯ããã·ã¹ãã ã¯ãæ£ç¢ºã§ä¿¡é Œæ§ãé«ããæ¥éã«é²åããã¢ããªãã£ã®éžæè¢ã®ç¶æ³ã«é©å¿ã§ããå¿ èŠããããŸããTypeScriptã®åŒ·åãªåä»ããç¹ã«å€å¥å ±çšäœã®ãããªãã¿ãŒã³ãæ¡çšããããšã§ããã®è€éãã®åŒ·åºãªåºç€ãæ§ç¯ã§ããŸãã
ä»åæŠèª¬ããã¢ããªãã£ã¿ã€ãã®å®è£ ã¯ãåãªãã³ãŒãæ§é 以äžã®ãã®ãæäŸããŸããããã¯ãåé¡ã«ã€ããŠèããããã®æç¢ºã§ä¿å®å¯èœãã€ã¹ã±ãŒã©ãã«ãªæ¹æ³ãæäŸããŸããæœè±¡çãªããžãã¹ã«ãŒã«ãããšã©ãŒãé²ããéçºè ã®çç£æ§ãåäžããããã©ãããã©ãŒã ãèªä¿¡ãæã£ãŠæé·ã§ããããã«ããå ·äœçã§ã¿ã€ãã»ãŒããªã³ãŒãã«å€æããŸããã°ããŒãã«ãªããžã¹ãã£ã¯ã¹äŒæ¥ã®ã«ãŒãã£ã³ã°ãšã³ãžã³ã倧éœåžåãã®ãã«ãã¢ãŒãã«ãªç§»åãã©ã³ããŒããŸãã¯èªåŸåããªãŒã管çã·ã¹ãã ãæ§ç¯ããŠãããã©ããã«ããããããé©åã«èšèšãããåã·ã¹ãã ã¯èŽ æ²¢åã§ã¯ãªããæåã«äžå¯æ¬ ãªéåçã§ãã