使用TypeScript和Express()

7
我希望使用最新版本的TypeScript中的node.js与Express。微软提供的示例中的express.d.ts似乎是建立在3.0.x之前的版本之上的。 在以前的版本中,您可以执行以下操作:
var app = express.createServer()

但在3.0.x之后,您应该这样做:

var app = express();

Express.d.ts不支持这个功能...我找到了一个变通方法:我在Express.d.ts中添加了以下行:

export function(): any;

app.ts中,当我想要创建应用程序对象时,我会执行以下操作:
var app = <express.ExpressServer>express();

这似乎解决了问题,它可以编译而不出错,同时我也获得了智能提示的支持。然而,这是一种hack(技巧)...首先,为什么我不能像这样写呢?

export function(): ExpressServer;

这是解决此问题的推荐方法吗?

4个回答

9

这是一个比较旧的讨论,但最近我也遇到了同样的问题,并发现在DefinitelyTyped网站上有一个新的express.d.ts文件,可以正确支持express 3。


2

你应该能够将这个环境函数声明添加到express.d.ts中以获得你想要的结果。

declare function express(): ExpressServer;


不太确定您的意思...我想要这个:///<reference path='express.d.ts'/> import express = module('express'); import vlcApi = module('vlc-node'); var app = <express.ExpressServer>express();,而且我在express.d.ts文件中有以下内容:///<reference path='node.d.ts' /> declare module "express" { export function createServer(): ExpressServer; export function static(path: string): any; export function(): any; //this is my hack since export function(): ExpressServer; does not work import http = module("http"); export var listen;请问您能否澄清一下? - Zoltan Arvai
啊,我现在明白了,他们把ExpressServer接口放在了module express声明内部。这就是为什么它不能像我的例子那样从外部访问。看起来express.d.ts文件需要重构,将这些接口声明移到外部范围,以便可以添加我展示的环境函数声明。 - joshuapoehls
我现在明白了。那绝对是一种可行的方法。 :) - Zoltan Arvai

0
如果你这样声明expressimport * as express from "express",在运行时会出现错误。但是,如果你这样声明:const express = require "express",就不会出现任何错误。
此外,别忘了将app变量或属性类型声明为express.Application

-4
这是一个示例项目 - 使用TypeScript编写的Express 4.x应用程序:{{link1:https://github.com/czechboy0/Express-4x-Typescript-Sample}}

2
这个示例项目完全不包含任何实际的TypeScript语法。我唯一看到与TypeScript有关的东西就是你的.tsd文件。 - aholt
这不是真的,看看那里的许多.ts文件,它们是用TypeScript编写的。但是项目的重点并不是教授TypeScript,而只是展示一个使用TypeScript的工作Express应用程序,因为实际上将js项目迁移到Express下的ts项目可能会很繁琐。但是如果您不喜欢,请不要使用它,没有人强迫您 :) - czechboy
2
我看到了.ts文件,但它们只是用纯JavaScript编写的。因此我的评论是“该示例项目绝对不包括任何TypeScript语法”。如果这些文件只包含纯粹的vanilla JavaScript代码,那么它们是否存在于其中我并不在乎。你不能仅仅通过将文件从.js重命名为.ts扩展名并添加一个.tsd文件来声称这是Express与TypeScript的示例,这不是它的工作方式。 - aholt
这不是我做的,.ts 文件是 TypeScript 的。如果你不相信我,可以尝试用 Node.js 将 .ts 文件作为 javascript 运行,你会发现它无法工作。TypeScript 是 JavaScript 的超集,因此它将具有许多相似之处,但是 TypeScript 中有比 JavaScript 更多的额外功能(如 let、import、class、更好的函数语法等等)。如果你查看 GitHub 项目,很多人都认为它是一个有用的 TypeScript 入门项目,所以我建议你再看一遍。没有必要敌对。 - czechboy
1
我纠正了。我要提一下有多个地方使用了JavaScript语法而非TypeScript。 - aholt
2
很遗憾,该示例使用 any 作为 Express 的类型,因此没有解决问题。 - Myrtle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接