2017-08-25 1 views
-1

Comment traiter les paramètres facultatifs dans Typescript?Traitement des paramètres facultatifs dans Typescript

J'ai le modèle suivant:

export class PowerPlant { 
    id: number; 
    orgName: string; 
    minPower: number; 
    maxPower: number; 
    powerPlantType: string; 
    rampRateInSeconds: number; 
    rampPowerInKw: number; 
} 

Dans ce modèle, les deux derniers champs à savoir les rampRateInSeconds et rampPowerInKw vont être des valeurs optionnelles et seront là en fonction de la chaîne de powerPlantType. Je veux être capable d'instancier ceci dans le constructeur et dans le constructeur, je vais vérifier la chaîne powerPlantType et si elle est d'un certain type, je voudrais définir ces 2 champs supplémentaires. En partant d'un contexte de programmation fonctionnelle, j'aurais ces 2 types comme optionnels et comme motif sur la chaîne powerPlantType et définirais les 2 valeurs en conséquence. Comment pourrais-je obtenir le même effet ici dans Typescript?

+0

'Je veux pouvoir instancier ceci dans le constructeur et dans le constructeur,' <= Un trop de constructeurs? Qu'avez-vous voulu écrire? – Igor

+1

Et sur quoi êtes-vous exactement collé? Il est assez facile de trouver comment définir des paramètres optionnels, par exemple. – jonrsharpe

+0

Copie possible: [Comment transmettre des paramètres optionnels dans TypeScript en omettant d'autres paramètres optionnels?] (Https://stackoverflow.com/a/30734778/1260204). Vous pouvez utiliser le même modèle pour un constructeur. – Igor

Répondre

1

Vous n'avez pas besoin d'une classe si vous n'avez pas de méthodes, une interface est suffisante et vous pouvez affecter des littéraux d'objet à des variables qui sont du type d'interface. Les interfaces peuvent avoir des paramètres optionnels, et donc vous ne pas besoin de spécifier tous les membres:

interface PowerPlant { 
    id: number; 
    orgName?: string; 
    minPower?: number; 
    maxPower?: number; 
    powerPlantType?: string; 
    rampRateInSeconds?: number; 
    rampPowerInKw?: number; 
    } 

    var x : PowerPlant = { 
     id: 10 
    } 

Si vous voulez quelque chose qui ressemble plus à motif que vous correspondant pouvez utiliser les types de syndicats discriminés et les gardes de type:

interface Square { 
    kind: "square"; 
    size: number; 
} 

interface Rectangle { 
    kind: "rectangle"; 
    width: number; 
    height: number; 
} 

interface Circle { 
    kind: "circle"; 
    radius: number; 
} 

type Shape = Square | Rectangle | Circle; 

function test1(s: Shape) { 
    if (s.kind === "square") { 
     s; // Square 
    } 
    else { 
     s; // Rectangle | Circle 
    } 
} 

Exemple précédent de here