Skip to content

Commit a156e5a

Browse files
committed
complete ts chapter - 3
1 parent edf7376 commit a156e5a

File tree

17 files changed

+452
-3
lines changed

17 files changed

+452
-3
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
|:-------:|:-------:|
55
| 1: Getting started with TypeScript | [Readme](/chapters/1/readme.md) |
66
| 2: Why and when to use TypeScript | [Readme](/chapters/2/readme.md) |
7-
| 3: TypeScript Core Types | [Readme]() |
7+
| 3: TypeScript Core Types | [Readme](/chapters/3/readme.md) |
88
| 4: Arrays | [Readme]() |
99
| 5: Enums | [Readme]() |
1010
| 6: Functions | [Readme]() |

chapters/1/readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Getting started with Node.js
1+
# Getting started with TypeScript
22

33
| **Topic** | **Code** |
44
|:---------:|:--------:|

chapters/2/readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# npm
1+
# Why and when to use TypeScript
22

33
| **Topic** | **Code** |
44
|:---------:|:--------:|

chapters/3/codes/3.1/app.ts

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
/*
2+
String literal types allow you to specify the exact value a string can have.
3+
*/
4+
5+
let myFavoritePet: "dog";
6+
// console.log(myFavoritePet); // undefined
7+
8+
/*
9+
myFavoritePet = "rock";
10+
console.log(myFavoritePet);
11+
// Error: Type '"rock"' is not assignable to type '"dog"'.
12+
*/
13+
14+
myFavoritePet = "dog";
15+
//console.log(myFavoritePet); // dog
16+
17+
// Together with Type Aliases and Union Types you get a enum-like behavior.
18+
type Species = "cat" | "dog" | "bird";
19+
20+
// They works well for User-Defined Type Guards.
21+
interface Pet {
22+
species: Species;
23+
name: String;
24+
eat();
25+
sleep();
26+
}
27+
28+
interface Cat extends Pet {
29+
species: "cat";
30+
}
31+
32+
interface Dog extends Pet {
33+
species: "dog";
34+
walk();
35+
}
36+
37+
interface Bird extends Pet {
38+
species: "bird";
39+
sing();
40+
}
41+
42+
/*
43+
Error: Interface 'Rock' incorrectly extends interface 'Pet'. Types of property 'species' are
44+
incompatible. Type '"rock"' is not assignable to type '"cat" | "dog" | "bird"'. Type '"rock"' is not
45+
assignable to type '"bird"'.
46+
interface Rock extends Pet {
47+
type: "rock";
48+
}
49+
*/
50+
51+
// String Literal Types can be used to distinguish overloads.
52+
53+
function buyPet(pet :Species, name: String) : Pet;
54+
function buyPet(pet :"cat", name: String) : Cat;
55+
function buyPet(pet :"dog", name: String) : Dog;
56+
function buyPet(pet :"bird", name: String) : Bird;
57+
function buyPet(pet :Species, name: String) : Pet {
58+
if(pet === "cat") {
59+
return {
60+
species: "cat",
61+
name: name,
62+
eat: function () {
63+
console.log(`${this.name} eats.`);
64+
},
65+
walk: function () {
66+
console.log(`${this.name} walks.`);
67+
},
68+
sleep: function () {
69+
console.log(`${this.name} sleeps.`);
70+
}
71+
} as Cat;
72+
} else if(pet === "dog") {
73+
return {
74+
species: "dog",
75+
name: name,
76+
eat: function () {
77+
console.log(`${this.name} eats.`);
78+
},
79+
walk: function () {
80+
console.log(`${this.name} walks.`);
81+
},
82+
sleep: function () {
83+
console.log(`${this.name} sleeps.`);
84+
}
85+
} as Dog;
86+
} else if(pet === "bird") {
87+
return {
88+
species: "bird",
89+
name: name,
90+
eat: function () {
91+
console.log(`${this.name} eats.`);
92+
},
93+
walk: function () {
94+
console.log(`${this.name} walks.`);
95+
},
96+
sleep: function () {
97+
console.log(`${this.name} sleeps.`);
98+
},
99+
sing: function () {
100+
console.log(`${this.name} sings.`);
101+
}
102+
} as Bird;
103+
} else {
104+
throw `Sorry we do not have a ${pet}. Would you like to buy a dog?`;
105+
}
106+
};
107+
108+
109+
function petIsCat(pet: Pet): pet is Cat {
110+
return pet.species === "cat";
111+
}
112+
113+
function petIsDog(pet: Pet): pet is Dog {
114+
return pet.species === "dog";
115+
}
116+
117+
function petIsBird(pet: Pet): pet is Bird {
118+
return pet.species === "bird";
119+
}
120+
121+
function playWithPet(pet: Pet){
122+
console.log(`Hey ${pet.name}, lets play.`);
123+
if(petIsCat(pet)) {
124+
// pet is now from type Cat (pet: Cat)
125+
pet.eat();
126+
pet.sleep();
127+
/*
128+
// Error: Type '"bird"' is not assignable to type '"cat"'.
129+
// pet.type = "bird";
130+
// Error: Property 'sing' does not exist on type 'Cat'.
131+
// pet.sing();
132+
*/
133+
} else if(petIsDog(pet)) {
134+
// pet is now from type Dog (pet: Dog)
135+
pet.eat();
136+
pet.walk();
137+
pet.sleep();
138+
} else if(petIsBird(pet)) {
139+
// pet is now from type Bird (pet: Bird)
140+
pet.eat();
141+
pet.sing();
142+
pet.sleep();
143+
} else {
144+
throw "An unknown pet. Did you buy a rock?";
145+
}
146+
}
147+
148+
let dog = buyPet(myFavoritePet /* "dog" as defined above */, "Dog-Rocky");
149+
let bird = buyPet(myFavoritePet /* "bird" as defined above */, "Bird-Rocky");
150+
let cat = buyPet(myFavoritePet /* "cat" as defined above */, "Cat-Rocky");
151+
152+
playWithPet(dog);
153+
console.log('-----------------\n');
154+
playWithPet(bird);
155+
console.log('-----------------\n');
156+
playWithPet(cat);
157+
console.log('-----------------\n');
158+
159+
/*
160+
Hey Dog-Rocky, lets play.
161+
Dog-Rocky eats.
162+
Dog-Rocky walks.
163+
Dog-Rocky sleeps.
164+
-----------------
165+
166+
Hey Bird-Rocky, lets play.
167+
Bird-Rocky eats.
168+
Bird-Rocky walks.
169+
Bird-Rocky sleeps.
170+
-----------------
171+
172+
Hey Cat-Rocky, lets play.
173+
Cat-Rocky eats.
174+
Cat-Rocky walks.
175+
Cat-Rocky sleeps.
176+
-----------------
177+
*/

chapters/3/codes/3.10/app.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// An array of values:
2+
let threePigs: number[] = [1, 2, 3];
3+
let genericStringArray: Array<string> = ['first', '2nd', '3rd'];
4+
5+
console.log(threePigs); // [ 1, 2, 3 ]
6+
console.log(genericStringArray); // [ 'first', '2nd', '3rd' ]

chapters/3/codes/3.11/app.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// A type to name a set of numeric values:
2+
// Number values default to 0:
3+
enum Day { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };
4+
let bestDay: Day = Day.Saturday;
5+
console.log(Day);
6+
/*
7+
{
8+
'0': 'Monday',
9+
'1': 'Tuesday',
10+
'2': 'Wednesday',
11+
'3': 'Thursday',
12+
'4': 'Friday',
13+
'5': 'Saturday',
14+
'6': 'Sunday',
15+
Monday: 0,
16+
Tuesday: 1,
17+
Wednesday: 2,
18+
Thursday: 3,
19+
Friday: 4,
20+
Saturday: 5,
21+
Sunday: 6
22+
}
23+
24+
*/
25+
console.log(bestDay); // 5
26+
27+
//Set a default starting number:
28+
enum TenPlus { Ten = 10, Eleven, Twelve }
29+
console.log(TenPlus);
30+
/*
31+
{
32+
'10': 'Ten',
33+
'11': 'Eleven',
34+
'12': 'Twelve',
35+
Ten: 10,
36+
Eleven: 11,
37+
Twelve: 12
38+
}
39+
40+
*/
41+
//or assign values:
42+
enum MyOddSet { Three = 3, Five = 5, Seven = 7, Nine = 9 }
43+
console.log(MyOddSet);
44+
/*
45+
{
46+
'3': 'Three',
47+
'5': 'Five',
48+
'7': 'Seven',
49+
'9': 'Nine',
50+
Three: 3,
51+
Five: 5,
52+
Seven: 7,
53+
Nine: 9
54+
}
55+
56+
*/

chapters/3/codes/3.12/app.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// When unsure of a type, any is available:
2+
let anything: any = 'I am a string';
3+
console.log(anything); // I am a string
4+
5+
anything = 5; // but now I am the number 5
6+
console.log(anything); // 5

chapters/3/codes/3.13/app.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/*
2+
If you have no type at all, commonly used for functions that do not
3+
return anything:
4+
5+
*/
6+
7+
function log(): void {
8+
console.log('I return nothing');
9+
}
10+
11+
log(); // I return nothing
12+
13+
// void types Can only be assigned null or undefined .

chapters/3/codes/3.2/app.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Array type with known and possibly different types:
2+
3+
let day: [number, string];
4+
day = [0, 'Monday'];
5+
console.log(day) // valid [ 0, 'Monday' ]
6+
/*
7+
day = ['zero', 'Monday']; // invalid: 'zero' is not numeric
8+
Type 'string' is not assignable to type 'number'.ts(2322)
9+
*/
10+
11+
console.log(day[0]); // 0
12+
console.log(day[1]); // Monday
13+
14+
day[1] = 'Saturday'; // valid: [ 0, 'Saturday' ]
15+
/*
16+
17+
day[2] = 'Sunday';
18+
// Tuple type '[number, string]' of length '2' has no element at index '2'.
19+
20+
day[3] = false;
21+
// invalid: must be union type of 'number | string'
22+
23+
*/
24+
console.log(day)

chapters/3/codes/3.3/app.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
A boolean represents the most basic datatype in TypeScript, with the purpose of
3+
assigning true/false values.
4+
*/
5+
6+
// set with initial value (either true or false)
7+
let isTrue: boolean = true;
8+
console.log(isTrue); // true
9+
10+
// defaults to 'undefined', when not explicitly set
11+
let unsetBool: boolean;
12+
console.log(unsetBool); // undefined
13+
14+
// can also be set to 'null' as well
15+
let nullableBool: boolean = null;
16+
console.log(nullableBool); // null

0 commit comments

Comments
 (0)