using typescript with the arcgis api for...

35
Using TypeScript with the ArcGIS API for JavaScript Rene Rubalcava – Julian Kissling – @odoenet @JulianKissling

Upload: others

Post on 27-Dec-2019

16 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Using TypeScript with the ArcGIS API forJavaScript

Rene Rubalcava –

Julian Kissling –

@odoenet

@JulianKissling

Page 2: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development
Page 3: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

AgendaTypeScript?FundamentalsAdvanced typesDevelopment tooling & setupWorking with the 4.x JS APIAccessor, decorators, and advanced concepts

Page 4: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

TypeScript?

Page 5: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Superset of JavaScriptTranspiles to JavaScriptESNext features (import, =>, rest/spread, async/await, etc)TypesCompatible with existing JavaScript

Page 6: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Benets of TypeScript

Easier for multiple people to work onEasier to refactorEasier to testCan help prevent technical debt

Page 7: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Fundamentals

Page 8: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Primitive (Basic) Typesboolean , number , string , [] , any

type Foo = number; const foo: Foo = 8; const bar: string = "Lorem ipsum"; // Here be dragons const waldo: any = doStuff: (things: any) => something ;

Page 9: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Type InferenceTypeScript compiler can infer types automatically

let foo = 8; // number type is inferred foo = 12; // Ok foo = "12"; // Error!

Page 10: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

InterfacesDene contracts between parts of an application

type Foo = number; type Bar = string; interface Foobar foo: Foo, bar: Bar const baz: Foobar = foo: 8, bar: "Lorem ipsum" ; // Ok const qux: Foobar = foo: "12", bar: "Lorem ipsum" // Error!

Page 11: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Interfaces facilitate predictable behavior

interface Foobar foo: number, bar: string const waldo = doStuff: (things: Foobar): Foobar => ( foo: things.foo + 1, bar: `$things.bar!` ) ; waldo.doStuff( foo: 1, bar: "a" ); // Ok, foo: 2, bar: "a!" waldo.doStuff(1, "a"); // Error!

Page 12: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Classesclass Waldo public doStuff(things: Foobar): Foobar ... private iterateNumber(num: number) return num + 1; private addExclamationPoint(str: string) return `$str!`; const testWaldo = new Waldo(); // Create a Waldo instance testWaldo.iterateNumber(2); // Error!

Page 13: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

ExtensionInterfaces can extend other interfaces or classesClasses can extend other classes and implement interfaces

interface Point x: number; y: number; interface Point3d extends Point z: number; class MyPoint implements Point3d x = 0; y = 0; z = 0; class My4dPoint extends MyPoint time = Date.now();

Page 14: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Advanced types

Page 15: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Union typesType something as one of multiple choices of a type

// Set a size as either a number, of a string like "1px", // "2em" etc function setSize(v: number | string) // ...

Page 16: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Type guardsType guards allow TS to infer a specic type when a value maytake multiple types ( union )

Types are narrowed to a more specic set by type guards

Builtin type guards like typeof , instanceof or taggedunions

function foo(v: number | string) if (typeof v === "number") // TS infers that v: number return v + 1; else // TS infers that v: string return `$v + 1`;

Page 17: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Type guardsTagged unions are very useful to discriminate unions ofinterfaces

interface Foo type: "foo"; foo: string; interface Bar type: "bar"; bar: string; function func(v: Foo | Bar) if (v.type === "foo") // TS infers that v: Foo return v.foo; else

Page 18: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

GenericsLike in C# or Java (not like metaprogramming with templates inC++)"Generalizes" types over type parameters

class List<T> constructor(private data?: T[]) find(f: (item: T) => boolean): T // ... // Fails const list = new List<number>(["1", "2"]); // OK const list = new List<number>([1, 2]);

Page 19: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Async/awaitMakes asynchronous programming easy again (mostly)Internally based on promises

Typescript polylls async/await when targetting ES5

Code

Page 20: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Development tooling

Page 21: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Essentialstypescript: npm install ­­save­dev typescriptJS API 4.x typings: npm install ­­save­dev@types/arcgis­js­apiJS API 3.x typings: npm install ­­save­dev@types/arcgis­js­api@3

Page 22: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Recommended

tslint: npm install ­­save­dev tslintVisual Studio Code

Page 23: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Setting Updevelopers.arcgis.com/javascript/latest/guide/typescript-setup

Page 24: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Working with the API

Page 25: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

ImportsJS API is currently strictly AMDConventionally classes are exported directlyRequires the use of require style imports

import MapView from "esri/views/MapView"Or, use esModuleInterop with typescript 2.7.2

Page 26: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Auto-castDue to nature of types, auto-cast does not type-check

get and set must have the same type

Auto-casting is supported in constructor signatures onlyStill helps in lots of casesFor setting properties, need to import the relevant modules

Page 27: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Typing improvementsUse of generics where possible Collection<T>Strictly type events ( MapView.on("mouse­wheel",...) ))

"Advanced" auto-casts like colors ( "red" ), screen sizes

( "5px" ) and basemaps "streets"

Page 28: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Advanced API concepts

Page 29: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

PromisesIn 4.7, promises are more compatible with native promisesReplaced then with when for esri/core/PromiseTypings are more compatible (although not fully compatible)General advice is to wrap API promises in native if needed untilJS API switches to native promises

Page 30: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Writing Accessor based classesCan be useful to use Accessor based classes in your appAlso required for creating custom API based widgetsAPI classes are using dojo declare, requires some additionalwork to integrate with TSCode

Page 31: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Multiple inheritanceMultiple inheritance possible with dojo declareSupported in typescript at runtime and strictly type-checkedUses declaration mergingCode

Page 32: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Extending the API typingsAPI typings are not always as strict as they can beIn rare occasions typings are missing or impreciseTypings can be externally "patched" through declarationmergingCode

Page 33: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development
Page 34: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development

Questions?

Where can I nd the slides/source?

github.com/jkissling/presentations/EU-DevSummit

Page 35: Using TypeScript with the ArcGIS API for JavaScriptproceedings.esri.com/library/userconf/devsummit-euro18/... · 2018-11-06 · TypeScript? Fundamentals Advanced types Development