Can typescript definitions
survive even at runtime?
Luca Del Puppo
Slide 2
Slide 2 text
➔ Reason Why?
➔ Common Mistakes
➔ strict mode
➔ any vs unknown
Agenda
Can typescript definitions survive even at runtime? Agenda
➔ Guards
➔ Validation
➔ Conclusion
Slide 3
Slide 3 text
Ego Slide
Luca Del Puppo
(aka Puppo)
Full-Stack Developer in Flowing
@puppo92
https://www.linkedin.com/in/lucadelpuppo/
[email protected]
Slide 4
Slide 4 text
WE ❤ REMOTE WORKING
Milan, Rome, Turin, Treviso, Bologna, Ancona, Catania and
wherever you want!
How we are ⮕ https://www.flowing.it/playbook/
Slide 5
Slide 5 text
Frontend Developer, Backend
Developer, UX Designer, AWS
Cloud Engineer
📣 WE ARE HIRING!
📣
Slide 6
Slide 6 text
Reason Why?
1
Slide 7
Slide 7 text
No content
Slide 8
Slide 8 text
No content
Slide 9
Slide 9 text
No content
Slide 10
Slide 10 text
Common Mistakes
2
Slide 11
Slide 11 text
Common Mistakes
➔ To think that typescript keeps always the code type-safe
➔ To forget that types disappears at runtime
➔ To use any if checking types is too hard or boring
➔ Don't know or forget the basics of js
➔ Don’t put a validation layer between the application and the
externals
Can typescript definitions survive even at runtime? Common Mistakes
Slide 12
Slide 12 text
No content
Slide 13
Slide 13 text
The basic
➔ Use types, interfaces or class to describe your object
➔ Describe at the best your types, use undefined and null if they are
necessary
➔ Create the right signature of your methods (don’t forget the result
type)
➔ Prefer immutable types (readonly, ReadOnly, ReadOnlyArray)
Can typescript definitions survive even at runtime?
Slide 14
Slide 14 text
strict mode
3
Slide 15
Slide 15 text
Strict mode
➔ It forces us to use the type-checker as a friend
➔ It prevents wrong checks or wrong accesses to the objects
➔ It forces us to write the code with the correct signatures
➔ It helps to find the errors at compile time instead of runtime
Can typescript definitions survive even at runtime? Strict Mode
Slide 16
Slide 16 text
No content
Slide 17
Slide 17 text
any vs unknown
4
Slide 18
Slide 18 text
any
Slide 19
Slide 19 text
unknown
Slide 20
Slide 20 text
Any vs Unknown
let myAny: any = true
myAny.trim().reverse().split(',');
let myAnyNumeric: number = myAny;
const sum = myAnyNumeric + 3;
let myUnknown: unknown = true;
myUnknown.trim(); // Property 'trim' does not exist on
type 'unknown'.ts(2339)
let myAnyNumeric: number = myUnknown; // Type
'unknown' is not assignable to type 'number'.ts(2322)
if (typeof myUnknown === 'string') myUnknown.trim();
if (typeof myUnknown === "number") {
let myAnyNumeric: number = myUnknown;
const sum = myAnyNumeric + 3;
}
Slide 21
Slide 21 text
Eslint
➔ eslint-config-airbnb-typescript
➔ @typescript-eslint/recommended
Can typescript definitions survive even at runtime? Strict Mode
Slide 22
Slide 22 text
_
Slide 23
Slide 23 text
Guards
5
Slide 24
Slide 24 text
“Type guards are functions used to check if an object respect a specific
type”
Their form is
Type Guard
Can typescript definitions survive even at runtime? Guards
declare function name(data: unknow): data is Type;
Slide 25
Slide 25 text
“Assert functions are functions used to check if an object respect a
specific type otherwise they throw an error”
Their form is
Asser Functions
Can typescript definitions survive even at runtime? Guards
declare function name(data: unknow): asserts data is Type;
Slide 26
Slide 26 text
Type Guards vs Assert Functions
type Circle = { type: 'circle'; radius: number; }
type Square = { type: 'square'; size: number; }
type Shape = Circle | Square;
function isCircle(shape: Shape): shape is Circle
{
return shape.type === 'circle';
}
function isSquare(shape: Shape): shape is Square
{
return shape.type === 'square';
}
type Circle = { type: 'circle'; radius: number; }
type Square = { type: 'square'; size: number; }
type Shape = Circle | Square;
function ensureCircle(shape: Shape): asserts
shape is Circle {
if (shape.type !== 'circle') throw new
Error('Not a circle');
}
function ensureSquare(shape: Shape): asserts
shape is Square {
if (shape.type !== 'square') throw new
Error('Not a square');
}
Slide 27
Slide 27 text
Validations
6
Slide 28
Slide 28 text
“In this case using the Validation word I want to focus you to the layer
between your application and the external”
● Data from API
● Data from socket
● All the data received from the external of your application
Validation
Can typescript definitions survive even at runtime? Validation
Slide 29
Slide 29 text
- Prevent wrong types at runtime
- Keep your code safer like during the development mode
- Help you to find quickly if the APIs are changed
- Prevent strange mistakes
- You are sure that the API results are exactly what you expected
Goal
Can typescript definitions survive even at runtime? Validation
Slide 30
Slide 30 text
Validation library
➔ Zod https://github.com/colinhacks/zod
➔ @sinclair/typebox https://github.com/sinclairzx81/typebox
➔ jsonschema https://github.com/tdegrunt/jsonschema
➔ io-ts https://github.com/gcanti/io-ts
Can typescript definitions survive even at runtime? Validation
Slide 31
Slide 31 text
_
Slide 32
Slide 32 text
Conclusioni
Slide 33
Slide 33 text
code
MUG-2022-ts-best-practices
code in action
https://puppo.github.io/MUG-2022-ts-best-practices/
dev.to series
https://dev.to/this-is-learning/series/11213
Slide 34
Slide 34 text
Thanks!
Thatʼs All!
Luca Del Puppo
@puppo92
https://www.linkedin.com/in/lucadelpuppo/
[email protected]