Systemy typów kojarzą się większości programistów z czymś naprawdę ciężkim, mocno akademickim i trudnym do zrozumienia, dodatkowo nie przydatnym w codziennym życiu developera. Postaram się to zmienić, przynajmniej cześciowo. O ile sam nie wierzę że świetna znajomość systemów typów uczyni Cię znacznie bardziej produktywnym, to postaram się rozwiać mit że jest to coś trudnego i niezrozumiałego. W przystępny i interaktywny sposób przedstawię odrobinę “Computer Science” które może pomóc nam zrozumieć dlaczego niektóre rzeczy w używanych przez nas językach są zaprojektowane tak, a nie inaczej.
Przede wszystkim odpowiemy zaś sobie na prawdę - jak bardzo “Typed” TypeScript tak naprawdę jest?
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
Artur Skowroński – Ten Typ tak ma - O systemach typów na przykładzie TypeScript'a
1. T E N TY P TA K M A
O S Y S T E M A C H T Y P Ó W N A P R Z Y K Ł A D Z I E
T Y P E S C R I P T ’ A
A R T U R S KO W R O Ń S K I
2. T H E R E A R E T W O H A R D T H I N G S
I N C O M P U T E R S C I E N C E :
P H I L K A R LT O N
C A C H E I N VA L I D AT I O N
N A M I N G T H I N G S
3. T H E R E A R E T W O H A R D T H I N G S
I N C O M P U T E R S C I E N C E :
P H I L K A R LT O N
C A C H E I N VA L I D AT I O N
N A M I N G T H I N G S
28. A N Y F O O L C A N W R I T E C O D E
T H AT A C O M P U T E R C A N
U N D E R S TA N D . G O O D
P R O G R A M M E R S W R I T E C O D E
T H AT H U M A N S C A N
U N D E R S TA N D .
M A R T I N F O W L E R
29. S TAT I C F I L E C H E C K I N G D O N E O N C O M P I L AT I O N T I M E
SOURCE
CODE
TYPE CHECKER
30. TYPE CHECKER
T Y P E C H E C K E R P R O V E S C H O S E N P R O P E R T I E S
“PROVEN”
CODE
54. N O M I N A L T Y P I N G
class Foo {
method(input: string): number { ... }
}
class Bar {
method(input: string): number { ... }
}
let foo: Foo = new Bar();
55. N O M I N A L T Y P I N G
class Foo {
method(input: string): number { ... }
}
class Bar {
method(input: string): number { ... }
}
let foo: Foo = new Bar();
56. N O M I N A L T Y P I N G
class Foo {
method(input: string): number { ... }
}
class Bar {
method(input: string): number { ... }
}
let foo: Foo = new Bar();
57. S T R U C T U R A L T Y P I N G
class Foo {
method(input: string): number { ... }
}
class Bar {
method(input: string): number { ... }
}
let foo: Foo = new Bar();
58. S T R U C T U R A L T Y P I N G
class Foo {
method(input: string): number { ... }
}
class Bar {
method(input: string): number { ... }
}
let foo: Foo = new Bar();
59. E X P L I C I T T Y P I N G
let foo: Foo = new Foo();let foo: Foo = new Foo();
60. M L & H I N D L E Y – M I L N E R M E T H O D
T Y P E I N F E R E N C E
72. E X . A R R AY S
let message: Array<string> = []
message.push("test");
message.push(2);
73. E X . A R R AY S
let message: Array<string> = []
message.push("test");
message.push(2);
74. E X . A R R AY S
let message: Array<string> = []
message.push("test");
message.push(2);
75. E X . A R R AY S
function unsafeAdd(arr: Array<string | number>): void {
arr.push(3)
}
let message: Array<string> = []
unsafeAdd(message)
const el: string = message[0]
console.log(el.toLowerCase())
76. U N S O U N D T Y P E S
function unsafeAdd(arr: Array<string | number>): void {
arr.push(3)
}
let message: Array<string> = []
unsafeAdd(message)
const el: string = message[1]
console.log(el.toLowerCase())
77. U N S O U N D T Y P E S
function unsafeAdd(arr: Array<string | number>): void {
arr.push(3)
}
let message: Array<string> = []
unsafeAdd(message)
const el: string = message[1]
console.log(el.toLowerCase())
78. U N S O U N D T Y P E S
function unsafeAdd(arr: Array<string | number>): void {
arr.push(3)
}
let message: Array<string> = []
unsafeAdd(message)
const el: string = message[1]
console.log(el.toLowerCase())
79. U N S O U N D T Y P E S
function unsafeAdd(arr: Array<string | number>): void {
arr.push(3)
}
let message: Array<string> = []
unsafeAdd(message)
const el: string = message[1]
console.log(el.toLowerCase())
80. U N S O U N D T Y P E S
function unsafeAdd(arr: Array<string | number>): void {
arr.push(3)
}
let message: Array<string> = []
const el: string = message[1]
console.log(el.toLowerCase())
81. U N S O U N D T Y P E S
function unsafeAdd(arr: Array<string | number>): void {
arr.push(3)
}
let message: Array<string> = []
unsafeAdd(message)
const el: string = message[1]
console.log(el.toLowerCase())
82. U N S O U N D T Y P E S
function unsafeAdd(arr: Array<string | number>): void {
arr.push(3)
}
let message: Array<string> = []
unsafeAdd(message)
const el: string = message[1]
console.log(el.toLowerCase())
83. U N S O U N D T Y P E S
function unsafeAdd(arr: Array<string | number>): void {
arr.push(3)
}
let message: Array<string> = []
unsafeAdd(message)
const el: string = message[0]
console.log(el.toLowerCase())
84. U N S O U N D T Y P E S
function unsafeAdd(arr: Array<string | number>): void {
arr.push(3)
}
let message: Array<string> = []
unsafeAdd(message)
const el: string = message[0]
console.log(el.toLowerCase())
85. U N S O U N D T Y P E S
function unsafeAdd(arr: Array<string | number>): void {
arr.push(3)
}
let message: Array<string> = []
unsafeAdd(message)
const el: string = message[0]
console.log(el.toLowerCase()) / int
86. VA L I D J S C O D E
function unsafeAdd(arr) {
arr.push(3)
}
var message = []
unsafeAdd(message)
var el = message[0]
console.log(el.toLowerCase())
88. H O W T O M A K E I T S O U N D
function checkIfTypeOk(el, type) {
if(!el instanceof type) throw new ClassCastException()
}
var message: Array<string> = []
unsafeAdd(message)
var el = message[0]
checkIfTypeOk(el, string)
console.log(el.toLowerCase())
89. H O W T O M A K E I T S O U N D
function checkIfTypeOk(el, type) {
if(!el instanceof type) throw new ClassCastException()
}
var message: Array<string> = []
unsafeAdd(message)
var el = message[0]
checkIfTypeOk(el, string)
console.log(el.toLowerCase())
90. H O W T O M A K E I T S O U N D
function checkIfTypeOk(el, type) {
if(!el instanceof type) throw new ClassCastException()
}
var message: Array<string> = []
unsafeAdd(message)
var el = message[0]
checkIfTypeOk(el, string)
console.log(el.toLowerCase())
91. H O W T O M A K E I T S O U N D
function checkIfTypeOk(el, type) {
if(!el instanceof type) throw new ClassCastException()
}
var message: Array<string> = []
unsafeAdd(message)
var el = message[0]
checkIfTypeOk(el, string)
console.log(el.toLowerCase())
92. T R A D E O F F : E A S Y T O U S E / C O R R E C T
C O M PAT I B L E W I T H J S
94. S O U R C E S
https://www2.ccs.neu.edu/racket/pubs/ecoop2015-takikawa-et-al.pdf
https://users.soe.ucsc.edu/~abadi/Papers/FTS-submitted.pdf
UNDERSTANDING TYPESCRIPT
https://blog.steveklabnik.com/posts/2010-07-17-what-to-know-before-debating-type-systems
WHAT TO KNOW BEFORE DEBATING TYPE SYSTEMS
TOWARDS PRACTICAL GRADUAL TYPING
https://papl.cs.brown.edu/2014/safety-soundness.html
SAFETY AND SOUNDNESS
95. S O U R C E S
https://www2.ccs.neu.edu/racket/pubs/ecoop2015-takikawa-et-al.pdf
https://users.soe.ucsc.edu/~abadi/Papers/FTS-submitted.pdf
UNDERSTANDING TYPESCRIPT
https://blog.steveklabnik.com/posts/2010-07-17-what-to-know-before-debating-type-systems
WHAT TO KNOW BEFORE DEBATING TYPE SYSTEMS
TOWARDS PRACTICAL GRADUAL TYPING
https://papl.cs.brown.edu/2014/safety-soundness.html
SAFETY AND SOUNDNESS
Q U E S T I O N S ?
T H A N K Y O U !