34
Using TypeScript with the ArcGIS API for JavaScript René Rubalcava – @odoenet

Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

  • Upload
    others

  • View
    62

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

Using TypeScript with the ArcGIS API forJavaScript

René Rubalcava – @odoenet

Page 2: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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

Page 3: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

TypeScript?

Page 4: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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

Page 5: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

Benets of TypeScript

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

Page 6: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

Fundamentals

Page 7: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 8: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

Type InferenceTypeScript compiler can infer types automatically

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

Page 9: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 10: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 11: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 12: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 13: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

Advanced types

Page 14: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 15: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 16: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 17: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 18: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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

Typescript polylls async/await when targetting ES5

Code

Page 19: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

Development tooling

Page 20: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 21: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

Recommended

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

Page 22: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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

Page 23: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

Working with the API

Page 24: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 25: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 26: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 27: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

Advanced API concepts

Page 28: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 29: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 30: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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

Page 31: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

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 32: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install
Page 33: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install

Questions?

Where can I nd the slides/source?

github.com/jkissling/odoe/presentations/2019-DC-DevSummit

Page 34: Using TypeScript with ArcGIS API for JavaScript · 2019-03-14 · Typescript polylls async/await when targetting ES 5 Cod e. Development tooling. Essentials typescript: npm install