34

I am using Personas which relies on the proprietary property navigator.id. Since this property is not standard, the TypeScript compiler generates the following warning:

$ 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'

But the .js file is successfully generated and runs on the FF15 browser without any warning/error message.
I also include a polyfill for navigator.id, as instructed by the documentation, so navigator.id will definitely by available in every browser.

Could someone suggest me how to deal with this warning?

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);
});
11
  • 1
    What is navigator? Where is it coming from? How is it declared? Commented Oct 3, 2012 at 6:53
  • 1
    @Sidharth: developer.mozilla.org/en-US/docs/DOM/window.navigator Commented Oct 3, 2012 at 6:55
  • 1
    Maybe relevant: developer.mozilla.org/en-US/docs/DOM/navigator.id ... it's a non-standard property. Commented Oct 3, 2012 at 6:56
  • @FelixKling - Tks for the info. Never used id on navigator. In fact, i try to stay away from using navigator all the time! Commented Oct 3, 2012 at 6:57
  • Does this really have anything to do with TypeScript? If you are really using the script for Persona authentication, it might be helpful for others to add this information to your question and change the title accordingly. Commented Oct 3, 2012 at 6:59

2 Answers 2

70

1) You can reinterpret navigator prop.

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

2) You can declare id prop youself

mycompany.lib.d.ts

interface Navigator {
  id: any
}

app.ts

navigator.id.request();

see this video http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript/ There Anders tell as jQuery.UI add new methods to jQuery (see 46 min)

Sign up to request clarification or add additional context in comments.

Comments

2

Add checks like if(navigator.id != null && typeof navigator.id != 'undefined') before stmt where navigator.id is referred

1 Comment

This will guard against undefined id at runtime, but the compiler will still complain that it breaks the interface. @Jack128's answer is good - add the interface definition. Better still, write a declaration header for the actual interface rather than just saying navigator.id : any.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.