如何处理 TypeScript 中内置对象的专有/自定义属性的警告

Posted

技术标签:

【中文标题】如何处理 TypeScript 中内置对象的专有/自定义属性的警告【英文标题】:How to handle warnings for proprietary/custom properties of built-in objects in TypeScript 【发布时间】:2012-09-24 01:44:24 【问题描述】:

我正在使用依赖于proprietary property navigator.id 的角色。由于此属性不是标准的,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'

但.js文件已成功生成并在FF15浏览器上运行,没有任何警告/错误消息。 根据文档的说明,我还为navigator.id 添加了一个polyfill,因此navigator.id 肯定会在每个浏览器中都可用。

有人可以建议我如何处理这个警告吗?

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);
);

【问题讨论】:

什么是navigator?它来自哪里?它是如何声明的? @Sidharth: developer.mozilla.org/en-US/docs/DOM/window.navigator 可能相关:developer.mozilla.org/en-US/docs/DOM/navigator.id ...这是一个非标准属性。 @FelixKling - 获取信息。从未在navigator 上使用过id。事实上,我一直尽量避免使用navigator 这真的和 TypeScript 有关系吗?如果您确实使用脚本进行角色身份验证,其他人将此信息添加到您的问题并相应地更改标题可能会有所帮助。 【参考方案1】:

1) 你可以重新解释 navigator 属性。

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

2) 你可以自己声明 id prop

mycompany.lib.d.ts

interface Navigator 
  id: any

app.ts

navigator.id.request();

观看此视频http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript/Anders 告诉 jQuery.UI 向 jQuery 添加新方法(请参阅 46 分钟)

【讨论】:

我选择了选项 2,因为它看起来像“Typescript 方式”,有助于最大限度地减少技术债务。【参考方案2】:

在引用 navigator.id 的 stmt 之前添加 if(navigator.id != null &amp;&amp; typeof navigator.id != 'undefined') 之类的检查

【讨论】:

这将在运行时防止未定义的 id,但编译器仍然会抱怨它破坏了接口。 @Jack128 的回答很好——添加接口定义。更好的是,为实际接口编写一个声明头,而不是仅仅说navigator.id : any

以上是关于如何处理 TypeScript 中内置对象的专有/自定义属性的警告的主要内容,如果未能解决你的问题,请参考以下文章

发布 TypeScript 包时如何处理可选的对等依赖项?

browserify 如何处理循环依赖?

如何处理 axios httpservice 可观察响应?

如何处理空的 JSON 对象?

如何处理没有其他关系的实体中的嵌套对象

AngularFire2 中的类:如何处理 $key