2015-09-03 2 views
0

я попытался сделать это, но this.element не могут быть назначены я не понимаю, почемумашинопись общий тип HTMLElement завернуть

class Elem<T> { 
    public element : T; 
    constructor(typeElement:string){ 
     this.element = document.createElement(typeElement); 
    } 
} 

как вы можете видеть playground

+0

«я пытался сделать это» - то, что * это *? – m02ph3u5

ответ

1

Ваш пример довольно близко, только проблема заключается в том, что T должен представлять, что он расширяет HTMLElement, а затем вы должны наложить HTMLElement на тип T (не уверен, почему) в стороне конструктора.

//   cast T as type HTMLElement 
class Elem<T extends HTMLElement> { 
    public element: T; 
    constructor(typeElement: string) { 
     // had to cast HTMLElement to type T.... 
     // odd because T extends HTMLElement, but it works 
     this.element = <T>document.createElement(typeElement); 
    } 
} 

var e = new Elem('div'); 
e.element.innerHTML = 'generic class test'; 
document.body.appendChild(e.element); 

Вы можете видеть, что это работает в playground

+0

Я считаю, что это не все. 'e.element' является базовым' HTMLElement', если вы не укажете 'new Elem (" div ")'. Но это означает, что можно написать «новый Elem (« body »)» или любую другую неправильную комбинацию. Компилятор не будет спорить. Попробуйте установить свойство не в базовом 'HTMLElement' (например,' align'), и оно не будет компилироваться. – adaskos

Смежные вопросы