Skip to content

Commit b898dfe

Browse files
Learn Utility Type
1 parent c00fffe commit b898dfe

File tree

5 files changed

+391
-1
lines changed

5 files changed

+391
-1
lines changed

Lesson07/src/main.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,4 @@ store.state = "Adrian"
140140

141141
const myState = new StateObject<(string | number | boolean)[]>([15])
142142
myState.state = (['Adrian', 19, true])
143-
console.log(myState.state);
143+
console.log(myState.state);

Lesson08/build/index.html

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7+
<title>Copyright</title>
8+
<style>
9+
body{
10+
background: #000;
11+
margin: 0;
12+
min-height: 100vh;
13+
display: grid;
14+
place-content: center;
15+
font-size: 3rem;
16+
color: #fff;
17+
}
18+
</style>
19+
<script src="js/main.js" defer></script>
20+
</head>
21+
<body>
22+
<p>Copyright &copy;<span id="year"></span></p>
23+
</body>
24+
</html>

Lesson08/build/js/main.js

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
"use strict";
2+
// Learn Utility Types
3+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5+
return new (P || (P = Promise))(function (resolve, reject) {
6+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
7+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
8+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
9+
step((generator = generator.apply(thisArg, _arguments || [])).next());
10+
});
11+
};
12+
const updateAssignment = (assign, propsToUpdate) => {
13+
return Object.assign(Object.assign({}, assign), propsToUpdate);
14+
};
15+
const assign1 = {
16+
studentId: "smkcmi2",
17+
title: "Final Project",
18+
grade: 0
19+
};
20+
console.log(updateAssignment(assign1, {
21+
grade: 95
22+
}));
23+
const assignGraded = updateAssignment(assign1, {
24+
grade: 95
25+
});
26+
// Required and Readonly
27+
const recordAssignment = (assign) => {
28+
// send to database, etx
29+
return assign;
30+
};
31+
const assignVerified = Object.assign(Object.assign({}, assignGraded), { verified: true });
32+
recordAssignment(Object.assign(Object.assign({}, assignGraded), { verified: true }));
33+
// Record
34+
const hexColorMap = {
35+
red: "FF0000",
36+
green: "00FF00",
37+
blue: "0000FF"
38+
};
39+
const finalGrades = {
40+
Adriana: "A",
41+
Della: "B"
42+
};
43+
const gradesData = {
44+
Adriana: {
45+
assign1: 90,
46+
assign2: 95
47+
},
48+
Della: {
49+
assign1: 93,
50+
assign2: 91
51+
},
52+
};
53+
const score = {
54+
studentId: "smkcmi201",
55+
grade: 89
56+
};
57+
const preview = {
58+
studentId: "smkcmi201",
59+
title: "Final Project",
60+
};
61+
// ReturnType
62+
// type newAssign = {
63+
// title: string,
64+
// points: number
65+
// }
66+
const createNewAssign = (title, points) => {
67+
return {
68+
title,
69+
points
70+
};
71+
};
72+
const tsAssign = createNewAssign("Utility Types", 100);
73+
console.log(tsAssign);
74+
const assignArgs = [
75+
"Generics",
76+
100
77+
];
78+
const tsAssign2 = createNewAssign(...assignArgs);
79+
console.log(tsAssign2);
80+
const fetchUsers = () => __awaiter(void 0, void 0, void 0, function* () {
81+
const data = yield fetch('https://jsonplaceholder.typicode.com/users').then(res => {
82+
return res.json();
83+
}).catch(err => {
84+
if (err instanceof Error) {
85+
console.log(err.message);
86+
}
87+
});
88+
return data;
89+
});
90+
fetchUsers().then(users => {
91+
console.log(users);
92+
});

Lesson08/src/main.ts

+168
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
// Learn Utility Types
2+
3+
// Partial
4+
5+
interface Assignment {
6+
studentId: string,
7+
title: string,
8+
grade: number,
9+
verified?: boolean
10+
}
11+
12+
const updateAssignment = ( assign: Assignment, propsToUpdate:Partial<Assignment>): Assignment => {
13+
return {
14+
...assign,
15+
...propsToUpdate
16+
}
17+
}
18+
19+
const assign1: Assignment = {
20+
studentId: "smkcmi2",
21+
title: "Final Project",
22+
grade: 0
23+
}
24+
console.log(updateAssignment(assign1, {
25+
grade: 95
26+
}));
27+
28+
const assignGraded: Assignment = updateAssignment(assign1, {
29+
grade: 95
30+
})
31+
32+
33+
// Required and Readonly
34+
35+
const recordAssignment = (assign: Required<Assignment>): Assignment => {
36+
// send to database, etx
37+
return assign
38+
}
39+
40+
const assignVerified: Readonly<Assignment> = {
41+
...assignGraded,
42+
verified: true
43+
}
44+
45+
recordAssignment({
46+
...assignGraded,
47+
verified: true
48+
})
49+
50+
// Record
51+
const hexColorMap: Record<string, string> = {
52+
red: "FF0000",
53+
green: "00FF00",
54+
blue: "0000FF"
55+
}
56+
57+
type Students = "Adriana" | "Della"
58+
type LetterGrades = "A" | "B" | "C" | "D" | "U"
59+
60+
const finalGrades: Record<Students, LetterGrades> = {
61+
Adriana: "A",
62+
Della: "B"
63+
}
64+
65+
interface Grades {
66+
assign1: number,
67+
assign2: number
68+
}
69+
70+
const gradesData: Record<Students, Grades> = {
71+
Adriana: {
72+
assign1: 90,
73+
assign2: 95
74+
},
75+
Della: {
76+
assign1: 93,
77+
assign2: 91
78+
},
79+
}
80+
81+
// Pick and Omit
82+
83+
type AssignResult = Pick<Assignment, "studentId" | "grade">
84+
85+
const score: AssignResult = {
86+
studentId: "smkcmi201",
87+
grade: 89
88+
}
89+
90+
type AssignPreview = Omit<Assignment, "grade" | "verified">
91+
92+
const preview: AssignPreview = {
93+
studentId: "smkcmi201",
94+
title: "Final Project",
95+
}
96+
// Exlude and Extract
97+
98+
type adjustedGrade = Exclude<LetterGrades, "U">
99+
100+
type highGrade = Extract<LetterGrades, "A" | "B">
101+
102+
// Nonnullable
103+
104+
type AllPossibleGrades = "Faiza" | "Saskia" | null | undefined
105+
106+
type NameOnly = NonNullable<AllPossibleGrades>
107+
108+
// ReturnType
109+
110+
// type newAssign = {
111+
// title: string,
112+
// points: number
113+
// }
114+
115+
const createNewAssign = (
116+
title: string,
117+
points: number
118+
) => {
119+
return {
120+
title,
121+
points
122+
}
123+
}
124+
125+
type NewAssign = ReturnType<typeof createNewAssign>
126+
127+
const tsAssign: NewAssign = createNewAssign("Utility Types", 100)
128+
console.log(tsAssign);
129+
130+
// Parameters
131+
132+
type AssignParams = Parameters<typeof createNewAssign>
133+
134+
const assignArgs: AssignParams = [
135+
"Generics",
136+
100
137+
]
138+
139+
const tsAssign2: NewAssign = createNewAssign(...assignArgs)
140+
console.log(tsAssign2);
141+
142+
// Awaited - helped us with the ReturnType of a Promite
143+
144+
interface User {
145+
id: number,
146+
name: string,
147+
username: string,
148+
email: string
149+
}
150+
151+
const fetchUsers = async (): Promise<User[]> => {
152+
const data = await fetch(
153+
'https://jsonplaceholder.typicode.com/users'
154+
).then(res => {
155+
return res.json()
156+
}).catch(err => {
157+
if (err instanceof Error) {
158+
console.log(err.message);
159+
}
160+
})
161+
return data
162+
}
163+
164+
type FetchUsersReturnType = Awaited<ReturnType<typeof fetchUsers>>
165+
166+
fetchUsers().then(users => {
167+
console.log(users);
168+
})

0 commit comments

Comments
 (0)