2012-10-03 18 views
13

Estoy usando Personas que se basa en el proprietary property navigator.id. Ya que esta propiedad no es estándar, el compilador genera mecanografiado la siguiente advertencia:Cómo manejar advertencias para propiedades propietarias/personalizadas de objetos incorporados en TypeScript

$ tsc home.ts --out my_ts_generated_code.js 
/Users/..../home.ts(27,18): The property 'id' does not exist on value of type 'Navigator' 

Pero el archivo .js se genera con éxito y se ejecuta en el navegador FF15 sin ningún mensaje de advertencia/error.
También incluyo un polyfill para navigator.id, como lo indica la documentación, por lo que navigator.id definitivamente estará disponible en cada navegador.

¿Podría alguien sugerirme cómo tratar esta advertencia?

index.html

<!-- some HTML omit above --> 
<script src="https://login.persona.org/include.js"></script> 
<script src="my_ts_generated_code.js"></script> 
<button class="btn" id="signin">Sign in</button> 
<button class="btn" id="signout">Sign out</button> 
<!-- some HTML omit below --> 

home.ts

declare var $; 

class Student { 
    fullname : string; 
    constructor(public firstname, public middleinitial, public lastname) { 
     this.fullname = firstname + " " + middleinitial + " " + lastname; 
    } 
} 

interface Person { 
    firstname: string; 
    lastname: string; 
} 

function greeter(person : Person) { 
    return "Hello, " + person.firstname + " " + person.lastname; 
} 

var user = new Student("Jane", "M.", "User"); 

$(function() { 
    $('#signin').on('click', function(e) { 
     e.preventDefault(); 
     navigator.id.request(); 
    }); 

    $('#signout').on('click', function(e) { 
     e.preventDefault(); 
     navigator.id.logout(); 
    }); 
    //document.body.innerHTML = greeter(user); 
}); 
+1

¿Qué es 'navigator'? ¿De dónde viene? ¿Cómo se declara? –

+0

@ Sidharth: https://developer.mozilla.org/en-US/docs/DOM/window.navigator –

+1

Quizás sea relevante: https://developer.mozilla.org/en-US/docs/DOM/navigator.id ... es una propiedad no estándar. –

Respuesta

18

1) Puede reinterpretar navegador prop.

(<any>navigator).id.request(); 

2) puede declarar Identificación apuntalar ti mismo

mycompany.lib.d.ts

interface Navigator { 
    id: any 
} 

app.ts

navigator.id.request(); 

ver el vídeo http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript/ Allí Anders decir como jQuery.UI agregar nuevos métodos a jQuery (ver 46 min)

+0

Fui con la Opción 2 ya que parece ser la "Manera de Mecanografiar" y ayuda a minimizar la deuda técnica. – rinogo

0

añadir otras comprobaciones antes como if(navigator.id != null && typeof navigator.id != 'undefined') stmt donde se conoce navigator.id

+1

Esto protegerá contra la identificación indefinida en el tiempo de ejecución, pero el compilador todavía se quejará de que rompe la interfaz. La respuesta de @Jack128 es buena: agregue la definición de la interfaz. Mejor aún, escriba un encabezado de declaración para la interfaz real en lugar de simplemente decir 'navigator.id: any'. –

Cuestiones relacionadas