Skip to content

Commit 3d87755

Browse files
Merge branch 'microsoft:main' into main
2 parents 213303e + d50507a commit 3d87755

File tree

15 files changed

+744
-11
lines changed

15 files changed

+744
-11
lines changed

.github/CODEOWNERS

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
# See https://github.com/OSS-Docs-Tools/code-owner-self-merge#readme
22

33
# Collaborators for Japanese Translation of the Website
4-
docs/playground/ja @sasurau4 @Quramy @Naturalclar [translation] [jp]
5-
docs/tsconfig/ja/**/*.md @sasurau4 @Quramy @Naturalclar [translation] [jp]
6-
docs/typescriptlang/ja/**/*.ts @sasurau4 @Quramy @Naturalclar [translation] [jp]
7-
docs/typescriptlang/ja.ts @sasurau4 @Quramy @Naturalclar [translation] [jp]
8-
docs/documentation/ja/**/*.md @sasurau4 @Quramy @Naturalclar [translation] [jp]
4+
docs/playground/ja @sasurau4 @Quramy @Naturalclar @uraway [translation] [jp]
5+
docs/tsconfig/ja/**/*.md @sasurau4 @Quramy @Naturalclar @uraway [translation] [jp]
6+
docs/typescriptlang/ja/**/*.ts @sasurau4 @Quramy @Naturalclar @uraway [translation] [jp]
7+
docs/typescriptlang/ja.ts @sasurau4 @Quramy @Naturalclar @uraway [translation] [jp]
8+
docs/documentation/ja/**/*.md @sasurau4 @Quramy @Naturalclar @uraway [translation] [jp]
99

1010
# Collaborators for Portuguese Translation of the Website
1111
docs/playground/pt @khaosdoctor @danilofuchs [translation] [pt]
@@ -29,11 +29,11 @@ docs/typescriptlang/zh.ts @Kingwl [translation] [zh]
2929
docs/documentation/zh/**/*.md @Kingwl [translation] [zh]
3030

3131
# Collaborators for Korean Translation of the Website
32-
docs/playground/ko @Bumkeyy @yeonjuan @guyeol @dvlprsh [translation] [ko]
33-
docs/tsconfig/ko/**/*.md @Bumkeyy @yeonjuan @guyeol @dvlprsh [translation] [ko]
34-
docs/typescriptlang/ko/**/*.ts @Bumkeyy @yeonjuan @guyeol @dvlprsh [translation] [ko]
35-
docs/typescriptlang/ko.ts @Bumkeyy @yeonjuan @guyeol @dvlprsh [translation] [ko]
36-
docs/documentation/ko/**/*.md @Bumkeyy @yeonjuan @guyeol @dvlprsh [translation] [ko]
32+
docs/playground/ko @bumkeyy @yeonjuan @guyeol @dvlprsh [translation] [ko]
33+
docs/tsconfig/ko/**/*.md @bumkeyy @yeonjuan @guyeol @dvlprsh [translation] [ko]
34+
docs/typescriptlang/ko/**/*.ts @bumkeyy @yeonjuan @guyeol @dvlprsh [translation] [ko]
35+
docs/typescriptlang/ko.ts @bumkeyy @yeonjuan @guyeol @dvlprsh [translation] [ko]
36+
docs/documentation/ko/**/*.md @bumkeyy @yeonjuan @guyeol @dvlprsh [translation] [ko]
3737

3838
# Collaborators for Indonesian Translation of the Website
3939
docs/playground/id @jefrydco @nusendra @mazipan @mandaputtra [translation] [id]

attribution.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
---
2+
title: TypeScript pour les Développeurs Java/C#
3+
short: TS pour les Développeurs Java/C#
4+
layout: docs
5+
permalink: /fr/docs/handbook/typescript-in-5-minutes-oop.html
6+
oneline: Apprenez TypeScript si vous avez de l'expérience avec les langages orientés objet
7+
---
8+
9+
TypeScript est un choix populaire pour les développeurs habitués aux autres langages à typage statique, comme le C# et le Java.
10+
11+
Le système de types de TypeScript offre la plupart de ces bénéfices : meilleure complétion de code, détection d'erreurs plus précoce, communication plus claire entre les composantes de votre programme.
12+
TypeScript fournit plusieurs fonctionnalités familières à ces développeurs, mais il est intéressant de faire un pas en arrière et apprendre comment le JavaScript (et par conséquent, TypeScript) diffère des langages orientés objet traditionnels.
13+
Comprendre ces différences vous permettra d'écrire du code JavaScript de meilleure qualité, et d'éviter les pièges communs dans lesquels les développeurs passant de C#/Java à TypeScript peuvent tomber.
14+
15+
## Apprendre le JavaScript
16+
17+
Si vous êtes déjà familier avec le JavaScript, mais vous êtes principalement un développeur Java ou C#, cette page d'introduction peut expliquer certaines idées fausses et pièges auxquels vous seriez susceptible.
18+
Certaines façons avec lesquelles TypeScript modélise les types sont très différentes du Java ou du C#. Il est important de s'en souvenir en apprenant TypeScript.
19+
20+
Si vous êtes un développeur Java ou C#, et vous êtes nouveau avec JavaScript en général, nous recommandons d'apprendre un peu de JavaScript _sans les types_ d'abord, afin de comprendre son comportement lors de l'exécution.
21+
Vu que TypeScript ne change pas comment votre code _s'exécute_, vous devrez quand même apprendre le JavaScript pour écrire du code qui fait réellement quelque chose !
22+
23+
Il est important de se rappeler que TypeScript utilise le même _runtime_ que le JavaScript, donc toute ressource sur comment accomplir un comportement particulier (conversion d'un string à un nombre, affichage d'une alerte, écriture d'un fichier, etc.) s'appliquera également en TypeScript.
24+
Ne vous limitez pas à ce qui est spécifique à TypeScript !
25+
26+
## Repenser les classes
27+
28+
Le C# et le Java sont ce qu'on pourrait appeler des langages à _POO obligatoire_.
29+
Dans ces langages, la _classe_ est l'unité basique d'organisation de code, ainsi que le conteneur de base de toutes les données _et_ de la logique à l'exécution.
30+
Obliger toute la fonctionnalité et toutes les données à être contenues dans des classes peut être un bon modèle de domaine pour certains problèmes, mais tous les modèles _ne doivent pas_ être représentés de cette façon.
31+
32+
### Fonctions et données libres
33+
34+
En JavaScript, les fonctions peuvent être placées n'importe où, et les données peuvent être librement relayées sans être cantonnées à une `class` ou une `struct`.
35+
Cette flexibilité est extrêmement puissante.
36+
Ces fonctions "libres" (celles qui ne sont pas associées à une classe), qui travaillent sur des données sans hiérarchie orientée objet, ont tendance à être le modèle préféré pour écrire un programme en JavaScript.
37+
38+
### Classes statiques
39+
40+
De plus, certaines structures du C# et du Java, comme les singletons et les classes statiques, ne sont pas nécessaires en TypeScript.
41+
42+
## POO en TypeScript
43+
44+
Cela dit, vous pouvez quand même utiliser des classes si vous le souhaitez !
45+
Certains problèmes ont une solution qui correspond à l'approche POO classique, et la capacité de TypeScript à supporter les classes JavaScript rendra ces solutions encore plus puissantes.
46+
TypeScript supporte plusieurs patterns comme l'implémentation d'interfaces, l'héritage, et les méthodes statiques.
47+
48+
Nous couvrirons les classes plus tard dans ce guide.
49+
50+
## Repenser les types
51+
52+
La façon dont TypeScript comprend la notion de _type_ est très différente du C# et du Java.
53+
Explorons certaines différences.
54+
55+
### Systèmes de Types Nominaux Réifiés
56+
57+
En C# ou Java, toute valeur a exactement un type - `null`, une primitive, ou un type de classe.
58+
Nous pouvons appeler des méthodes comme `value.GetType()` ou `value.getClass()` pour obtenir le type exact à l'exécution.
59+
La définition de ce type réside dans une certaine classe sous un certain nom, et nous n'avons pas le droit d'utiliser deux classes à formes similaires de façon interchangeable, sauf si une relation explicite d'héritage existe ou une interface en commun est implémentée.
60+
61+
Ces aspects décrivent un système _réifié et nominal_ de types.
62+
Les types qu'on écrit sont présents à l'exécution, et ils sont liés à eux via leurs déclarations, pas leurs structures.
63+
64+
### Types en tant qu'ensembles
65+
66+
En C# ou Java, cela a du sens de faire une correspondance entre un type à l'exécution et sa déclarations à la compilation.
67+
68+
En TypeScript, il vaut mieux de penser aux types comme des _ensembles de valeurs_ qui partagent quelque chose en commun.
69+
Parce que les types ne sont que des ensembles, une valeur peut appartenir à _plusieurs_ ensembles en même temps.
70+
71+
Une fois que vous pensez aux types en tant qu'ensembles, certaines opérations deviennent naturelles.
72+
Par exemple, en C#, il est bizarre de transmettre une valeur qui est _soit_ un `string` ou `int`, parce qu'il n'existe aucun type les représentant tous les deux.
73+
74+
En TypeScript, ce procédé devient naturel quand vous pensez aux types en tant qu'ensembles.
75+
Comment décrire une valeur qui appartient, soit à l'ensemble des `string`, soit à celui des `number` ?
76+
Elle appartient simplement à l'_union_ de ces ensembles : `string | number`.
77+
78+
TypeScript fournit un certain nombre de mécanismes pour travailler avec les types de façons similaires à la théorie des ensembles, et ces façons seront plus intuitives si on pense aux types en tant qu'ensembles.
79+
80+
### Types Structurels Effacés
81+
82+
En TypeScript, les objets n'ont _pas_ de seul et unique type.
83+
Par exemple, si nous créons un objet qui correspond à une interface, nous pouvons utiliser cet objet là où l'interface est attendue même si aucune relation de déclaration n'existait entre les deux.
84+
85+
```ts twoslash
86+
interface Pointlike {
87+
x: number;
88+
y: number;
89+
}
90+
interface Named {
91+
name: string;
92+
}
93+
94+
function logPoint(point: Pointlike) {
95+
console.log("x = " + point.x + ", y = " + point.y);
96+
}
97+
98+
function logName(x: Named) {
99+
console.log("Hello, " + x.name);
100+
}
101+
102+
const obj = {
103+
x: 0,
104+
y: 0,
105+
name: "Origin",
106+
};
107+
108+
logPoint(obj);
109+
logName(obj);
110+
```
111+
112+
Le système de types de TypeScript est _structurel_, et non nominal : nous pouvons utiliser `obj` en tant que `Pointlike` parce qu'`obj` a les propriétés `x` et `y` qui sont toutes les deux des nombres.
113+
Les relations entre types sont déterminées par les propriétés qu'ils contiennent, et non pas avec une relation de déclaration entre eux.
114+
115+
Le système de types de TypeScript n'est également _pas réifié_: rien ne va pouvoir nous dire qu'`obj` est un `Pointlike`, lors de l'exécution.
116+
D'ailleurs, le type `Pointlike` n'est _même pas présent_ lors de l'exécution.
117+
118+
Si nous revenons à notre façon de réfléchir aux types _en tant qu'ensemble_, nous pouvons dire qu'`obj` est membre de l'ensemble `Pointlike`, ainsi que de l'ensemble `Named`.
119+
120+
### Conséquences du typage structurel
121+
122+
Deux aspects particuliers de ce système surprennent souvent les développeurs POO.
123+
124+
#### Types vides
125+
126+
Le premier est que le _type vide_ a l'air d'agir de manière impromptue :
127+
128+
```ts twoslash
129+
class Empty {}
130+
131+
function fn(arg: Empty) {
132+
// fais quelque chose ?
133+
}
134+
135+
// Pas d'erreur, mais ce n'est pas un Empty ?
136+
fn({ k: 10 });
137+
```
138+
139+
TypeScript détermine si l'appel à `fn` est valide en déterminant si l'argument fourni est un `Empty` valide.
140+
Cela est accompli en examinant la _structure_ de `{ k: 10 }` et `class Empty { }`.
141+
Nous pouvons voir que `{ k: 10 }` a _toutes_ les propriétés d'`Empty` vu qu'`Empty` n'a aucune propriété.
142+
C'est donc un appel valide !
143+
144+
Cela peut paraître surprenant, mais c'est au final une relation très similaire à celle respectées dans les langages POO nominaux.
145+
Une sous-classe ne peut pas _retirer_ une propriété de sa classe-mère, parce que faire cela détruirait la relation de sous-type naturelle existant entre la sous-classe et sa classe-mère.
146+
Les systèmes de type structurels identifient cette relation en décrivant les sous-types de façon à avoir des propriétés à types compatibles.
147+
148+
#### Types identiques
149+
150+
Les types identiques sont une autre source fréquente de surprises :
151+
152+
```ts
153+
class Car {
154+
drive() {
155+
// accélérer
156+
}
157+
}
158+
class Golfer {
159+
drive() {
160+
// frapper la balle fort
161+
}
162+
}
163+
164+
// Pas d'erreur ?
165+
let w: Car = new Golfer();
166+
```
167+
168+
Encore une fois, ceci n'est pas une erreur parce que les _structures_ de ces classes sont les mêmes.
169+
Cela peut paraître comme une source de confusion, mais en pratique, les classes identiques n'ayant aucun rapport ne sont pas communes.
170+
171+
Nous apprendrons plus sur comment les classes sont liées l'une à l'autre dans leur chapitre.
172+
173+
### Réflexivité
174+
175+
Les développeurs POO ont l'habitude de pouvoir demander le type de n'importe quelle valeur, même générique :
176+
177+
```csharp
178+
// C#
179+
static void LogType<T>() {
180+
Console.WriteLine(typeof(T).Name);
181+
}
182+
```
183+
184+
Mais parce que le système de types de TypeScript est complètement effacé, aucune information sur, par exemple, l'instanciation d'un type générique n'est disponible à l'exécution.
185+
186+
JavaScript possède quelques opérateurs comme `typeof` et `instanceof`, mais souvenez-vous que ces opérateurs agissent sur les valeurs, tel qu'elles existent dans le code sans informations de types.
187+
Par exemple, `typeof (new Car())` va retourner `"object"`, et non `Car` ni `"Car"`.
188+
189+
## Prochaines étapes
190+
191+
C'était un bref résumé de la syntaxe et des outils régulièrement utilisés en TypeScript. À partir de là, vous pourrez :
192+
193+
- Lire le Manuel [du début à la fin](/docs/handbook/intro.html) (30m)
194+
- Explorer les [exemples du bac à sable](/play#show-examples)
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
---
2+
title: Mapped Types
3+
layout: docs
4+
permalink: /ko/docs/handbook/2/mapped-types.html
5+
oneline: "이미 존재하는 타입을 재사용해서 타입을 생성하기"
6+
---
7+
8+
중복을 피하기 위해서 다른 타입을 바탕으로 새로운 타입을 생성할 수 있습니다.
9+
10+
매핑된 타입은 이전에 선언하지 않았던 프로퍼티의 타입을 선언할 수 있는 인덱스 시그니처 문법로 구성됩니다.
11+
12+
```ts twoslash
13+
type Horse = {};
14+
// ---cut---
15+
type OnlyBoolsAndHorses = {
16+
[key: string]: boolean | Horse;
17+
};
18+
19+
const conforms: OnlyBoolsAndHorses = {
20+
del: true,
21+
rodney: false,
22+
};
23+
```
24+
25+
매핑된 타입은 `PropertyKey`([`keyof`을 통해서](/docs/handbook/2/indexed-access-types.html) 자주 생성되는)의 조합을 사용하여 키를 통해 타입을 반복적으로 생성하는 제너릭 타입입니다.
26+
27+
```ts twoslash
28+
type OptionsFlags<Type> = {
29+
[Property in keyof Type]: boolean;
30+
};
31+
```
32+
33+
다음 예제에서, `OptionsFlags``Type` 타입의 모든 프로퍼티를 가져와서 해당 값을 불린으로 변경합니다.
34+
35+
```ts twoslash
36+
type OptionsFlags<Type> = {
37+
[Property in keyof Type]: boolean;
38+
};
39+
// ---cut---
40+
type FeatureFlags = {
41+
darkMode: () => void;
42+
newUserProfile: () => void;
43+
};
44+
45+
type FeatureOptions = OptionsFlags<FeatureFlags>;
46+
// ^?
47+
```
48+
49+
### Mapping Modifiers
50+
51+
매핑중에는 추가할 수 있는 수정자로 `readonly``?` 있습니다. 각각 가변성과 선택성에 영향을 미칩니다.
52+
53+
`-` 또는 `+`를 접두사로 붙여서 이런 수정자를 추가하거나 제거할 수 있습니다. 접두사를 추가하지 않으면 `+`로 간주합니다.
54+
55+
```ts twoslash
56+
// 타입의 프로퍼티에서 'readonly' 속성을 제거합니다
57+
type CreateMutable<Type> = {
58+
-readonly [Property in keyof Type]: Type[Property];
59+
};
60+
61+
type LockedAccount = {
62+
readonly id: string;
63+
readonly name: string;
64+
};
65+
66+
type UnlockedAccount = CreateMutable<LockedAccount>;
67+
// ^?
68+
```
69+
70+
```ts twoslash
71+
// 타입의 프로퍼티에서 'optional' 속성을 제거합니다
72+
type Concrete<Type> = {
73+
[Property in keyof Type]-?: Type[Property];
74+
};
75+
76+
type MaybeUser = {
77+
id: string;
78+
name?: string;
79+
age?: number;
80+
};
81+
82+
type User = Concrete<MaybeUser>;
83+
// ^?
84+
```
85+
86+
## Key Remapping via `as`
87+
88+
TypeScript 4.1 이상에서는 매핑된 타입에 `as` 절을 사용해서 매핑된 타입의 키를 다시 매핑할 수 있습니다.
89+
90+
```ts
91+
type MappedTypeWithNewProperties<Type> = {
92+
[Properties in keyof Type as NewKeyType]: Type[Properties]
93+
}
94+
```
95+
96+
[템플릿 리터럴 타입](/docs/handbook/2/template-literal-types.html)과 같은 기능을 활용해서 이전 프로퍼티에서 새로운 프로퍼티 이름을 만들 수 있습니다.
97+
98+
```ts twoslash
99+
type Getters<Type> = {
100+
[Property in keyof Type as `get${Capitalize<string & Property>}`]: () => Type[Property]
101+
};
102+
103+
interface Person {
104+
name: string;
105+
age: number;
106+
location: string;
107+
}
108+
109+
type LazyPerson = Getters<Person>;
110+
// ^?
111+
```
112+
113+
조건부 타입을 통해 `never`를 생성해서 키를 필터링할 수 있습니다.
114+
115+
```ts twoslash
116+
// 'kind' 프로퍼티를 제거합니다
117+
type RemoveKindField<Type> = {
118+
[Property in keyof Type as Exclude<Property, "kind">]: Type[Property]
119+
};
120+
121+
interface Circle {
122+
kind: "circle";
123+
radius: number;
124+
}
125+
126+
type KindlessCircle = RemoveKindField<Circle>;
127+
// ^?
128+
```
129+
130+
`string | number | symbol` 의 조합뿐만 아니라 모든 타입의 조합을 임의로 매핑할 수 있습니다.
131+
132+
```ts twoslash
133+
type EventConfig<Events extends { kind: string }> = {
134+
[E in Events as E["kind"]]: (event: E) => void;
135+
}
136+
137+
type SquareEvent = { kind: "square", x: number, y: number };
138+
type CircleEvent = { kind: "circle", radius: number };
139+
140+
type Config = EventConfig<SquareEvent | CircleEvent>
141+
// ^?
142+
```
143+
144+
### Further Exploration
145+
146+
매핑된 타입은 타입 조작 섹션의 다른 기능들과 잘 동작합니다. 예를 들어 객체의 `pii` 프로퍼티가 `true`로 설정되어 있는지에 따라 `true` 혹은 `false`를 반환하는 [조건부 타입을 사용한 매핑된 타입](/docs/handbook/2/conditional-types.html)이 있습니다.
147+
148+
```ts twoslash
149+
type ExtractPII<Type> = {
150+
[Property in keyof Type]: Type[Property] extends { pii: true } ? true : false;
151+
};
152+
153+
type DBFields = {
154+
id: { format: "incrementing" };
155+
name: { type: string; pii: true };
156+
};
157+
158+
type ObjectsNeedingGDPRDeletion = ExtractPII<DBFields>;
159+
// ^?
160+
```

0 commit comments

Comments
 (0)