J'essaie de me faire une idée de la manière de créer une classe javascript qui représenterait un objet comme Person .
class Person {
constructor(name, age, hobbies) {
this.name = name; // string
this.age = age; // number
this.hobbies = hobbies; // array
}
}
Cet objet sera utilisé dans react / redux-form pour mapper les données entrantes et sortantes de / vers la base de données . Ma question est de savoir comment puis-je faire en sorte que les passe-temps soient vraiment de type array ou age comme numéro et nom comme string dans sa définition de classe? En java , je suis autorisé à créer un modèle de données simple via un type fort de sa propriété (par exemple, String name = null) et ayant getter / setter méthode pour cela.
5 Réponses :
Javascript est un langage typé dynamiquement, ce qui signifie que les erreurs ne se produisent qu'une fois le programme exécuté. Autrement dit, au moment de l'exécution. Cela signifie qu'un programme écrit dans un langage à typage dynamique peut compiler même s'il contient des erreurs de type qui autrement empêcheraient le script de s'exécuter correctement.
Vous devrez utiliser Typescript pour cela dans react, et il est possible d'écrire des applications de réaction dans Typescript. Tapezcript est un sur-ensemble syntaxique strict de JavaScript, et ajoute un typage statique facultatif au langage. TypeScript est conçu pour le développement de grandes applications et transcompiles vers JavaScript
En dehors de la saisie, les getters / setters sont pris en charge dans JS
Ce que vous suggérez par cette réponse n’est pas vrai. Le typage dynamique n'implique pas l'absence de vérification de type. Bien que les types ne puissent pas être vérifiés par analyse statique dans ce cas, la vérification de type dynamique reste possible et constitue une option viable. De plus, les grandes applications peuvent être écrites en JavaScript où les développeurs sont réellement compétents dans la langue .
si vous n'utilisez pas dactylographié ou une sorte de bibliothèque de saisie, vous devez le gérer vous-même. Donc, dans votre exemple:
class Person {
constructor(name, age, hobbies) {
name = typeof name === 'string'?name:null;
age = typeof age === 'number'?age:null;
hobbies = Array.isArray(hobbies)?hobbies:null;
...
}
}
Vous voudrez peut-être faire une vérification plus approfondie, mais cela vous permettra de démarrer.
Ty pour l'idée! Je pensais utiliser typeof et Array.isArray lors de la lecture mais je ne savais pas comment l'implémenter en classe. Votre exemple clarifie.
OP doit comprendre comment implémenter getter / setter en JavaScript. Donc, ce n'est pas suffisant car la propriété hobbies peut être réaffectée à une valeur non-tableau après la construction.
class Person {
constructor(name, age, hobbies) {
this.name = name; // string
this.age = age; // number
this.hobbies = hobbies; // array
}
setName(name){
console.log(typeof name=="string")
if(typeof name=="string")
this.name = name;
}
setAge(age){
if(typeof age=="number")
this.age = age;
}
}
let person = new Person('Rahi','45',["dfdsf","dd"])
console.log("....name=%s, age=%s",person.name,person.age);
person.setName("John");
console.log("....name=%s",person.name);
person.setName(9999);
console.log("....name=%s",person.name);
console.log("................");
person.setAge("45");
console.log("....name=%s",person.name);
person.setAge(45);
console.log("....name=%s",person.name);
console.log("....name=%s, age=%s",person.name,person.age);
Vous pouvez vérifier le type de méthode sur ensemble pour définir le type de valeur correct.
Vous pouvez utiliser l'opérateur typeof a > avec indexOf () pour faire la validation.
class Person {
constructor(name, age, hobbies) {
let hobbyList = ["sports", "cooking", "movies"];
if(typeof name !== "string"){
throw "Name must be a string!";
} else {
this.name = name;
}
if(typeof age !== "number"){
throw "Age must be a number!"
} else {
this.age = age;
}
if(hobbyList.indexOf(hobbies) <=0){
throw "Must be a choice from the list"
} else {
this.name = name;
}
}
}
let p1 = new Person(12,"twelve", "archery"); // all args are bad - 3 errors
let p2 = new Person("Scott", 52, "movies") // good - no errors
encore mieux! :-)
Hormis la validation lors de l'instanciation de l'objet. Une validation supplémentaire peut être effectuée via un setter (comme vous le souhaitez) lorsque la valeur de la propriété change:
const person = new Person ( "Me", 465, "not a list of hobbies" );
Par conséquent, ce qui suit générera une erreur
class Person {
constructor(name, age, hobbies) {
if (!Array.isArray(hobbies)) {
console.error(`Type of hobbies should 'array', found ${typeof hobbies}`);
}
Object.defineProperties(this, {
age: {
get: () => age,
set: value => {
age = value;
}
},
name: {
get: () => name,
set: value => {
name = value;
}
},
hobbies: {
get: () => hobbies,
set: value => {
if (!Array.isArray(value)) {
console.error(`Type of hobbies should 'array', found ${typeof value}`);
}
hobbies = value;
}
}
});
}
}
C'est aussi simple que cela. En savoir plus sur Object.defineProperties .
J'apprécie grandement votre contribution!
doit-il être dans JS? ou pouvez-vous utiliser TypeScript à la place? (puis transpilez-le)
malheureusement, je suis verrouillé pour n'utiliser que JS.
vous n'avez besoin d'aucune bibliothèque ou TypeScript ou quoi que ce soit pour répondre à vos besoins. JavaScript fournit en fait des fonctionnalités pour les accomplir et plus encore. Je vais le démontrer dans une nouvelle réponse.