我使用Angular 2,TypeScript和SignalR设置了一个.NET Core项目。我创建并使用了DefinitelyTyped的jQuery和SignalR类型。
有几篇文章(比如one)建议我通过声明中心服务器和客户端上可用内容的接口为我的SignalR中心添加一些强类型。
经过大量调整后,我终于让IDE开心了:它可以毫不费力地检测接口和扩展。但是,每当我进行构建时,TypeScript都会抱怨它找不到名称“IRoomHub”(我的集线器接口名称)。
这是我的接口的声明,它保存在信号器文件夹中的hubs.d.ts文件中,用于我的打字(全局安装):
interface SignalR {
roomHub: IRoomHub;
}
interface IRoomHub {
client: IRoomHubClient;
server: IRoomHubServer;
}
interface IRoomHubClient {
initiateTimer: (startMinutes: number) => void;
}
interface IRoomHubServer {
initiateTimer(roomId: number, startMinutes: number): Promise<void>;
}
我的用法是在我的脚本文件夹中:
import { Component, OnInit } from '@angular/core';
import { RoomService } from './room.service';
import { Room } from './room';
@Component({
selector: 'rooms',
template: `...`,
providers: [RoomService]
})
export class AdministrationPage implements OnInit {
roomHub: IRoomHub;
constructor(private roomService: RoomService) { }
rooms: Room[];
initialize(room: Room) {
this.roomHub.server.initiateTimer(room.id, room.startMinutes);
}
getRooms(): void {
this.roomService.getRooms().then(rooms => this.rooms = rooms);
}
ngOnInit(): void {
this.getRooms();
this.roomHub = $.connection.roomHub;
}
}
我的tsConfig:
{
"compilerOptions": {
"noImplicitAny": false,
"noEmitOnError": true,
"removeComments": false,
"sourceMap": true,
"target": "es5",
"outDir": "../wwwroot/scripts/app",
"emitDecoratorMetadata": true,
"experimentalDecorators": true
},
"exclude": [
"node_modules",
"wwwroot"
]
}
和我的输入index.d.ts文件:
/// <reference path="globals/core-js/index.d.ts" />
/// <reference path="globals/jasmine/index.d.ts" />
/// <reference path="globals/jquery/index.d.ts" />
/// <reference path="globals/node/index.d.ts" />
/// <reference path="globals/signalr/index.d.ts" />
/// <reference path="globals/signalr/hubs.d.ts" />
我尝试从界面更改为导出界面,将其包含在声明命名空间和声明模块中,但编译器始终无法以某种方式查找它。此外,它也找不到$
。如果我的代码示例中没有足够的信息,我的代码全部可用here。
答案 0 :(得分:0)
确保 typings.json 文件中包含 jquery 。
“jquery”:“registry:dt / jquery”,
执行: typings install
希望它有所帮助。