创建typescript类以使用现有Javascript和主干对象
我开始从事一个使用主干网和Javascript的项目。我不确定如何开始集成Typescript。例如,我们公司的名称空间位于视图、模型、对象等之前。因此,在没有typescript的情况下,创建主干对象看起来是这样的:创建typescript类以使用现有Javascript和主干对象,javascript,backbone.js,typescript,Javascript,Backbone.js,Typescript,我开始从事一个使用主干网和Javascript的项目。我不确定如何开始集成Typescript。例如,我们公司的名称空间位于视图、模型、对象等之前。因此,在没有typescript的情况下,创建主干对象看起来是这样的: Company.Views.MyNewView = (function () { return Backbone.View.extend({ } })(); 所以现在,使用Typescript,我想我可以 class Company.Views.MyNewView { }
Company.Views.MyNewView = (function () { return Backbone.View.extend({ } })();
所以现在,使用Typescript,我想我可以
class Company.Views.MyNewView {
}
但是,Typescript不喜欢名称中的句点。因此,我的第一个问题是如何在项目中对现有名称空间使用Typescript?这些名称空间仅定义为
var Company = Company || {};
Company.Views = Company.Views || {};
我的第二个问题更一般。展望未来,Typescript能否轻松地与现有项目集成,其中所有内容都是用标准javascript定义的?我真的不知道如何访问任何非Typescript类对象。提前谢谢
编辑:
尝试与现有Javascript对象集成
declare module Company.Views {
export class MyNewRouter extends Company.BaseRouter {
// It does not recognize Company.BaseRouter
}
}
Typescript具有模块的概念。模块实际上相当于公司| |{} 因此,您可以执行以下操作:
module Company{
export module Views{
export function MyNewView(){
return <any>Backbone.View.extend({ });
}
}
}
一个更简单的例子
以下类型脚本:
module Company{
// You need to do at least one export
// for compiler to generate any code
export var foo = 123;
}
生成:
var Company;
(function (Company) {
Company.foo = 123;
})(Company || (Company = {}));
用于集成现有JS
您需要为typescript创建声明以了解您的Js。Js不在乎是否在一个文件中声明变量并在另一个文件中使用它。TypeScript需要进行编译时检查,因此它不需要
最简单的声明是:
declare var SomeJSStuff:any;
你可以 对于第二部分,以下是您将如何做到这一点:
// Declare your JS stuff
declare module Company {
export class BaseRouter {
// Additionally declare any memebers of BaseRouter
// e.g:
someProp:number;
}
}
// Now use your JS Stuff in typescript
module Company.Views {
export class MyNewRouter extends Company.BaseRouter {
// It recognizes Company.BaseRouter
}
}
所以听起来至少对于旧的名称空间,我至少需要将它们导出为模块?不需要。如果你想在typescript中使用现有的名称空间,你需要使用声明。对于新名称空间,请使用modules,但如果我有一个名为Company.BaseRouter的现有JS对象,我不能扩展该类型,可以吗?我在我的原始帖子底部添加了我尝试过的片段。添加了第二个答案来回答我看到的thatAh。因此,在不更改当前javascript名称空间的情况下,我必须声明一个新模块,我的typescript可以看到它复制了已经存在的代码。如果我不立即转换所有内容,这会导致以后出现问题吗?
// Declare your JS stuff
declare module Company {
export class BaseRouter {
// Additionally declare any memebers of BaseRouter
// e.g:
someProp:number;
}
}
// Now use your JS Stuff in typescript
module Company.Views {
export class MyNewRouter extends Company.BaseRouter {
// It recognizes Company.BaseRouter
}
}