refactoring on types

This commit is contained in:
Géry Debongnie
2019-01-23 11:12:54 +01:00
parent 3766fbc7b8
commit 08938d2334
15 changed files with 85 additions and 65 deletions
+9 -12
View File
@@ -1,35 +1,32 @@
import QWeb from "./qweb_vdom";
import { init } from "../../../libs/snabbdom/src/snabbdom";
import sdListeners from "../../../libs/snabbdom/src/modules/eventlisteners";
import sdAttrs from "../../../libs/snabbdom/src/modules/attributes";
import { VNode } from "../../../libs/snabbdom/src/vnode";
import QWeb from "./qweb_vdom";
const patch = init([sdListeners, sdAttrs]);
export interface Env {
export interface WidgetEnv {
qweb: QWeb;
services: { [key: string]: any };
[key: string]: any;
}
export default class Widget {
export default class Widget<T extends WidgetEnv> {
name: string = "widget";
template: string = "<div></div>";
vnode: VNode | null = null;
parent: Widget | null = null;
children: Widget[] = [];
env: Env;
parent: Widget<T> | null = null;
children: Widget<T>[] = [];
env: T;
el: HTMLElement | null = null;
state: Object = {};
refs: { [key: string]: Widget } = {};
refs: { [key: string]: Widget<T> } = {};
//--------------------------------------------------------------------------
// Lifecycle
//--------------------------------------------------------------------------
constructor(parent: Widget | Env, props?: any) {
constructor(parent: Widget<T> | T, props?: any) {
if (parent instanceof Widget) {
this.parent = parent;
parent.children.push(this);
@@ -99,7 +96,7 @@ export default class Widget {
return vnode;
}
private visitSubTree(callback: (w: Widget) => void) {
private visitSubTree(callback: (w: Widget<T>) => void) {
callback(this);
for (let child of this.children) {
child.visitSubTree(callback);
+10 -9
View File
@@ -2,13 +2,15 @@ import { VNode } from "../../../libs/snabbdom/src/vnode";
import h from "../../../libs/snabbdom/src/h";
export type EvalContext = { [key: string]: any };
type RawTemplate = string;
type ParsedTemplate = Document;
type CompiledTemplate = (context: EvalContext) => VNode;
export type RawTemplate = string;
export type CompiledTemplate<T> = (context: EvalContext) => T;
const RESERVED_WORDS = "true,false,NaN,null,undefined,debugger,console,window,in,instanceof,new,function,return,this,typeof,eval,void,Math,RegExp,Array,Object,Date".split(
","
);
type ParsedTemplate = Document;
// Compilation Context
export class Context {
nextID: number = 1;
@@ -84,7 +86,7 @@ export class Context {
export default class QWeb {
rawTemplates: { [name: string]: RawTemplate } = {};
parsedTemplates: { [name: string]: ParsedTemplate } = {};
templates: { [name: string]: CompiledTemplate } = {};
templates: { [name: string]: CompiledTemplate<VNode> } = {};
h = h;
exprCache: { [key: string]: string } = {};
directives: Directive[] = [];
@@ -183,7 +185,7 @@ export default class QWeb {
return template(context);
}
_compile(name: string): CompiledTemplate {
_compile(name: string): CompiledTemplate<VNode> {
if (name in this.templates) {
return this.templates[name];
}
@@ -205,10 +207,9 @@ export default class QWeb {
`Template: ${this.rawTemplates[name]}\nCompiled code:\n` + functionCode
);
}
const template: CompiledTemplate = (new Function(
"context",
functionCode
) as CompiledTemplate).bind(this);
const template = (new Function("context", functionCode) as CompiledTemplate<
VNode
>).bind(this);
this.templates[name] = template;
return template;
}