Maison > interface Web > js tutoriel > le corps du texte

Questions d'entretien technique - Partie Typescript

Barbara Streisand
Libérer: 2024-10-25 03:20:29
original
237 Les gens l'ont consulté

Introduction

Bonjour, bonjour !! :D

J'espère que vous allez tous bien !

Comment nous nous sentons vraiment :
Technical Interview Questions - Part  Typescript

Je suis de retour avec la deuxième partie de cette série. ?

Dans ce chapitre, nous aborderons les questions ✨Typescript✨ auxquelles j'ai été confronté lors des entretiens.

Je vais garder l’intro courte, alors allons-y directement !

## Questions
1. Que sont les génériques en dactylographie ? Qu'est-ce que  ?
2. Quelles sont les différences entre les interfaces et les types ?
3. Quelles sont les différences entre any, null, inconnu et jamais ?


Question 1 : Que sont les génériques en dactylographie ? Qu'est-ce que  ?

La réponse courte est...

Les génériques dans TypeScript nous permettent de créer des fonctions, des classes et des interfaces réutilisables qui peuvent fonctionner avec une variété de types, sans avoir à en spécifier un en particulier. Cela permet d'éviter d'en utiliser comme type fourre-tout.

La syntaxe est utilisé pour déclarer un type générique, mais vous pouvez également utiliser , ou tout autre espace réservé.

Comment ça marche ?

Décomposons cela avec un exemple.

Supposons que j'ai une fonction qui accepte un paramètre et renvoie un élément du même type. Si j'écris cette fonction avec un type spécifique, cela ressemblerait à ceci :

function returnElement(element: string): string {
 return element;
}


const stringData = returnElement("Hello world");
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Je sais que le type de stringData sera « string » car je l'ai déclaré.

Technical Interview Questions - Part  Typescript

Mais que se passe-t-il si je souhaite renvoyer un type différent ?

const numberData = returnElement(5);
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Je recevrai un message d'erreur car le type diffère de ce qui a été déclaré.

Technical Interview Questions - Part  Typescript

La solution pourrait être de créer une nouvelle fonction pour renvoyer un type numérique.

function returnNumber(element: number): number {
 return element;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Cette approche fonctionnerait, mais elle pourrait conduire à une duplication de code.

Une erreur courante pour éviter cela consiste à utiliser any au lieu d'un type déclaré, mais cela va à l'encontre de l'objectif de la sécurité des types.

function returnElement2(element: any): any {
 return element;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Cependant, l'utilisation de any nous fait perdre la fonctionnalité de sécurité de type et de détection d'erreurs dont dispose Typescript.
De plus, si vous commencez à en utiliser chaque fois que vous devez éviter le code en double, votre code perdra sa maintenabilité.

C’est précisément à ce moment-là qu’il est avantageux d’utiliser des génériques.

function returnGenericElement<T>(element: T): T {
 return element;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

La fonction recevra un élément d'un type spécifique ; ce type remplacera le générique et le restera tout au long de l'exécution.

Cette approche nous permet d'éliminer le code dupliqué tout en préservant la sécurité des types.

function returnElement(element: string): string {
 return element;
}


const stringData = returnElement("Hello world");
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Mais que se passe-t-il si j'ai besoin d'une fonction spécifique provenant d'un tableau ?

On pourrait déclarer le générique sous forme de tableau et l'écrire comme ceci :

const numberData = returnElement(5);
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Alors,

function returnNumber(element: number): number {
 return element;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Les types déclarés seront remplacés par le type fourni en paramètre.

Technical Interview Questions - Part  Typescript

Nous pouvons également utiliser des génériques en cours.

function returnElement2(element: any): any {
 return element;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

J'ai trois points à souligner à propos de ce code :

  1. add est une fonction de flèche anonyme (dont j'ai parlé dans le premier chapitre).
  2. Le générique peut être nommé , , ou même , si vous préférez.
  3. Comme nous n'avons pas encore spécifié le type, nous ne pouvons pas implémenter d'opérations à l'intérieur des classes. Par conséquent, nous devons instancier la classe en déclarant le type du générique puis implémenter la fonction.

Voici à quoi ça ressemble :

function returnGenericElement<T>(element: T): T {
 return element;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Et, une dernière chose à ajouter avant de terminer cette question.
N'oubliez pas que les génériques sont une fonctionnalité de Typescript. Cela signifie que les génériques seront effacés lorsque nous les compilerons en Javascript.

De

const stringData2 = returnGenericElement("Hello world");


const numberData2 = returnGenericElement(5);
Copier après la connexion
Copier après la connexion

à

function returnLength<T>(element: T[]): number {
 return element.length;
}
Copier après la connexion
Copier après la connexion

Question 2 : Quelles sont les différences entre les interfaces et les types ?

La réponse courte est :

  1. La fusion de déclarations fonctionne avec les interfaces mais pas avec les types.
  2. Vous ne pouvez pas utiliser d'outils dans une classe avec des types d'union.
  3. Vous ne pouvez pas utiliser d'extensions avec une interface utilisant des types d'union.

Concernant le premier point, Qu'est-ce que j'entends par fusion de déclarations ?

Laissez-moi vous montrer :
J'ai défini deux fois la même interface en l'utilisant dans une classe. La classe incorporera alors les propriétés déclarées dans les deux définitions.

const stringLength = returnLength(["Hello", "world"]);
Copier après la connexion
Copier après la connexion

Cela ne se produit pas avec les types. Si nous essayons de définir un type plus d'une fois, TypeScript générera une erreur.

class Addition<U> {
 add: (x: U, y: U) => U;
}
Copier après la connexion
Copier après la connexion

Technical Interview Questions - Part  Typescript

Technical Interview Questions - Part  Typescript

Concernant les points suivants, différencions les types d'union et d'intersection :

Les types d'union nous permettent de spécifier qu'une valeur peut être de plusieurs types. Ceci est utile lorsqu'une variable peut contenir plusieurs types.

Les types d'intersection nous permettent de combiner des types en un seul. Il est défini à l'aide de l'opérateur &.

const operation = new Addition<number>();


operation.add = (x, y) => x + y; => We implement the function here


console.log(operation.add(5, 6)); // 11
Copier après la connexion
Copier après la connexion

Type de syndicat :

function returnGenericElement<T>(element: T): T {
 return element;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Type d'intersection :

function returnElement(element: string): string {
 return element;
}


const stringData = returnElement("Hello world");
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Si nous essayons d'utiliser le mot-clé Implements avec un type d'union, tel que Animal, TypeScript générera une erreur. En effet, les implémentations attendent une seule interface ou un seul type, plutôt qu'un type d'union.

const numberData = returnElement(5);
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Technical Interview Questions - Part  Typescript

Typescript nous permet d'utiliser des « outils » avec :

a. Types d'intersections

function returnNumber(element: number): number {
 return element;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

b. Interfaces

function returnElement2(element: any): any {
 return element;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
function returnGenericElement<T>(element: T): T {
 return element;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

c. Type unique.

const stringData2 = returnGenericElement("Hello world");


const numberData2 = returnGenericElement(5);
Copier après la connexion
Copier après la connexion

Le même problème se produit lorsque nous essayons d'utiliser des extensions avec un type d'union. TypeScript générera une erreur car une interface ne peut pas étendre un type d'union. Voici un exemple

function returnLength<T>(element: T[]): number {
 return element.length;
}
Copier après la connexion
Copier après la connexion

Vous ne pouvez pas étendre un type d'union car il représente plusieurs types possibles et il n'est pas clair quelles propriétés de type doivent être héritées.

Technical Interview Questions - Part  Typescript

MAIS vous pouvez étendre un type ou une interface.

const stringLength = returnLength(["Hello", "world"]);
Copier après la connexion
Copier après la connexion

Vous pouvez également étendre un seul type.

class Addition<U> {
 add: (x: U, y: U) => U;
}
Copier après la connexion
Copier après la connexion

Question 3 : Quelles sont les différences entre any, null, inconnu et jamais ?

Réponse courte :

Tout => Il s'agit d'une variable de type supérieur (également appelée type universel ou supertype universel). Lorsque nous utilisons any dans une variable, la variable peut contenir n’importe quel type. Il est généralement utilisé lorsque le type spécifique d'une variable est inconnu ou susceptible de changer. Cependant, leur utilisation n’est pas considérée comme une bonne pratique ; il est recommandé d'utiliser plutôt des génériques.

const operation = new Addition<number>();


operation.add = (x, y) => x + y; => We implement the function here


console.log(operation.add(5, 6)); // 11
Copier après la connexion
Copier après la connexion

Bien que any autorise des opérations telles que l'appel de méthodes, le compilateur TypeScript ne détectera pas les erreurs à ce stade. Par exemple :

function returnGenericElement<T>(element: T): T {
 return element;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Vous pouvez attribuer n'importe quelle valeur à n'importe quelle variable :

function returnGenericElement(element) {
 return element;
}
Copier après la connexion

De plus, vous pouvez attribuer une variable n'importe quelle à une autre variable avec un type défini :

interface CatInterface {
 name: string;
 age: number;
}


interface CatInterface {
 color: string;
}


const cat: CatInterface = {
 name: "Tom",
 age: 5,
 color: "Black",
};
Copier après la connexion

Inconnu => Ce type, comme n’importe quel autre, peut contenir n’importe quelle valeur et est également considéré comme le type supérieur. Nous l'utilisons lorsque nous ne connaissons pas le type de variable, mais il sera attribué plus tard et restera le même pendant l'exécution. L'inconnu est un type moins permissif que n'importe quel autre.

type dog = {
 name: string;
 age: number;
};


type dog = { // Duplicate identifier 'dog'.ts(2300)
 color: string;
};


const dog1: dog = {
 name: "Tom",
 age: 5,
 color: "Black", //Object literal may only specify known properties, and 'color' does not exist in type 'dog'.ts(2353)
};
Copier après la connexion

L'appel direct de méthodes sur un inconnu entraînera une erreur de compilation :

type cat = {
 name: string;
 age: number;
};


type dog = {
 name: string;
 age: number;
 breed: string;
};
Copier après la connexion

Technical Interview Questions - Part  Typescript

Avant de l'utiliser, nous devons effectuer des vérifications telles que :

type animal = cat | dog;
Copier après la connexion

Comme n'importe quel autre, nous pourrions attribuer n'importe quel type à la variable.

type intersectionAnimal = cat & dog;
Copier après la connexion

Cependant, nous ne pouvons pas attribuer le type inconnu à un autre type, mais tout ou inconnu.

function returnElement(element: string): string {
 return element;
}


const stringData = returnElement("Hello world");
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Cela nous montrera une erreur
Technical Interview Questions - Part  Typescript


Nul => La variable peut contenir l’un ou l’autre type. Cela signifie que la variable n'a pas de valeur.

const numberData = returnElement(5);
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Tenter d'attribuer un autre type à une variable nulle entraînera une erreur :

function returnNumber(element: number): number {
 return element;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Technical Interview Questions - Part  Typescript


Jamais => Nous utilisons ce type pour spécifier qu'une fonction n'a pas de valeur de retour.

function returnElement2(element: any): any {
 return element;
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

La fin...

On termine avec Typescript,

Technical Interview Questions - Part  Typescript

Pour aujourd'hui (?

J'espère que cela a été utile à quelqu'un.

Si vous avez des questions techniques lors de l'entretien que vous aimeriez que je vous explique, n'hésitez pas à me le faire savoir dans les commentaires. ??

Passez une bonne semaine ?

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!