LitElement is written in TypeScript so has great typings for all APIs, and TypeScript (and Babel 7) decorators. There's also a template type-checker CLI, compiler plugin, and VS Code extension: https://github.com/runem/lit-analyzer
The big difference from Fast is that LitElement's render() method is an instance method, so it can access any state with `this.` and any properties and methods it uses can be overridden. But it's all just as declarative:
import { LitElement, customElement, property, html } from 'lit-element';
@customElement('hello-world')
export class HelloWorldElement extends LitElement {
@property()
name: string = 'World';
render() {
return html`
<h1>Hello ${this.name}</h1>
`;
}
}