Typescript-stöd för Polymer v3
Jag testar för närvarande Polymer 3-preview för att se hur det kan integreras i vårt teamarbetsflöde.
Det rekommenderade sättet att deklarera ett element i v3 är:
import { PolymerElement } from '@polymer/polymer/polymer-element.js';
...
class MyElement extends PolymerElement {
...
}
Se: https://www.polymer-project.org/blog/2018-03-23-polymer-3-latest-preview.html
Detta fungerar bra med TypeScript för grundläggande saker, men det förstår inte att klassen MyElement utökar HTMLElement. Så om jag försöker använda this.dispatchEvent(...) i min kod, kommer kompileringen att misslyckas.
Jag försökte sätta en .d.ts för att försöka lära TypeScript men jag kunde inte få det att fungera. Alla de försöken var i princip misslyckade.
1) Direkt skrivning:
class PolymerElement extends HTMLElement{}
2) Skriva modulen:
declare module "polymer-element" {
export class PolymerElement extends HTMLElement {}
}
Och några fler variationer men det verkar aldrig bli utvalda av transpileraren. Några idéer?
Svar #1
Från och med version 3.0.5 ingår TypeScript-deklarationer i själva @polymer/polymer NPM-paketet, och för alla iron-, paper- etc. element från och med version 3.0.0.
import {PolymerElement, html} from '@polymer/polymer';
class MyElement extends PolymerElement {
static get template() {
return html`<p>Hello [[who]]</p>`;
}
static get properties() {
return {
who: String,
};
}
who = 'World';
}
customElements.define('my-element', MyElement);
Du kan också använda paketet @polymer/decorators för att få bättre typkontroll och en mer bekväm syntax:
import {PolymerElement, html} from '@polymer/polymer';
import {customElement, property} from '@polymer/decorators';
@customElement('my-element')
class MyElement extends PolymerElement {
static get template() {
return html`<p>Hello [[who]]</p>`;
}
@property({type: String})
who = 'World';
}
Svar #2
Jag är ganska säker på att du var tvungen att deklarera modulen som "@polymer/polymer/polymer-element" istället för bara "polymer-element", om du inte lade till typdefinitionerna direkt till sökvägen @polymer/polymer i din node_modules.
Jag är inte heller säker på att du ska importera polymer-element.js, utan importera polymer-element. .js-tillägget kan störa tillägget av typdefinitionerna.
