在TypeScript中,我可以将变量的类型定义为类的类型.例如:
class MyClass { ... }
let myVar: typeof MyClass = MyClass;
Run Code Online (Sandbox Code Playgroud)
现在我想将它与泛型类一起使用,如下所示:
class MyManager<T> {
constructor(cls: typeof T) { ... }
/* some other methods, which uses instances of T */
}
let test = new MyManager(MyClass); /* <MyClass> should be implied by the parameter */
Run Code Online (Sandbox Code Playgroud)
所以,我想给我的经理类另一个类(它的构造函数),因为管理器需要检索与该类关联的静态信息.
在编译我的代码时,它说它找不到名字'T',我的构造函数在哪里.
知道怎么解决吗?
我有一个基类EventEmitter,它具有on绑定特定事件处理程序的方法:
class EventEmitter {
on(event: string, handler: Function) {
/* add handler internally */
}
protected emit(event: string, ...args) {
/* call all handlers listening on event */
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有各种子类,它们可以使用不同的参数发出不同的事件.我想"声明"该特定类可以发出哪些事件:
class MyClass extends EventEmitter {
on(event: 'event1', handler: (arg1: number) => void): void;
on(event: 'event2', handler: (arg1: string, arg2: number) => void): void;
}
Run Code Online (Sandbox Code Playgroud)
所以,我的子类可以发出事件event1和event2,但是这似乎并没有被指定正确的方式.TypeScript(tsc 1.8)正在补偿:
error TS2415: Class 'MyClass' incorrectly extends base class 'EventEmitter'.
Types of property 'on' are incompatible. …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Angular 开发前端应用程序。由于我向HTTP POST 和 GET 请求添加了授权标头,因此我收到了405 Method Not Allowed,尽管我似乎允许服务器端的所有内容。
我的浏览器 Chrome 中的调试器说它要求Access-Control-Request-Method: POST和Access-Control-Request-Headers: authorization,我的后端允许同时,access-control-allow-methods: GET, POST和access-control-allow-headers: authorization,以及access-control-allow-credentials: true。
我不明白我在这里缺少什么。服务器是一个 node.js express 服务器,标头设置如下:
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST');
res.setHeader('Access-Control-Allow-Credentials', 'true');
res.setHeader('Access-Control-Allow-Headers', 'authorization');
Run Code Online (Sandbox Code Playgroud)
前端代码(Angular 5)如下所示:
this.http.request('post', apiUrl, {
headers: new HttpHeaders().set('Authorization', 'Bearer abc'),
}).subscribe(response => {
// some code
});
Run Code Online (Sandbox Code Playgroud)
哪里this.http是角的实例HttpClient。
我的前端应用程序是从我的本地主机域“ http://frontend.localhost/app ”提供的,我的后端服务器位于“ http://backend.localhost ”。
我的问题是,我是否缺少一些必须在后端设置的标头?我需要在我的前端应用程序中设置一些选项吗?
我在键盘上按S,然后按D,然后释放S.为什么下面的代码在我释放S之后再次触发D的按键事件?有没有办法找出D的第二个下行事件是由另一个键的关键引起的?
function handler(event) {
if (!event.repeat) console.log(event.code, event.type);
}
window.addEventListener('keydown', handler);
window.addEventListener('keyup', handler);Run Code Online (Sandbox Code Playgroud)
输出:
KeyS keydown - S pressed
KeyD keydown - D pressed
KeyS keyup - S released
KeyD keydown - WHY???
Run Code Online (Sandbox Code Playgroud)
奇怪的keydown事件只发生在Chrome中(我在Linux Mint上使用的是Chromium 66.0.3359.139),这在Firefox中不会发生.
这可能是一个错误,还是预期的行为?
我有一个用TypeScript编写的本地节点包,我想在实际项目中使用它.使用npm,我可以像这样安装本地包:
$ npm install --save /path/to/package
Run Code Online (Sandbox Code Playgroud)
要么:
$ npm install --save /path/to/package.tar.gz
Run Code Online (Sandbox Code Playgroud)
这将在node_modules目录中安装所需的.js文件.在该包中还有一个生成的.d.ts文件,我想将其安装到我的项目中(在typings/tsd.d.ts中自动链接它).但使用以下命令无效:
$ tsd install /path/to/package/package.d.ts --save
Run Code Online (Sandbox Code Playgroud)
它说>> zero results.那么,在不需要存储库的情况下安装本地定义文件的方法是什么?
更新:
我可以简单地将我的d.ts文件复制到typings目录和我的文本编辑器(对我来说,它是使用TypeScript插件的Sublime Text),它能够找到声明.目录布局是这样的:
/my-project/
/typings/
tsd.d.ts - auto-generated by `tsd install`
node/ - I've installed the node definitions
my-package.d.ts - copied or symlinked file
my-project.ts - I'm working here
Run Code Online (Sandbox Code Playgroud)
但是,在module.exports(exports = function...在TypeScript中)导出唯一的函数时,我遇到了一个问题.在这种情况下,导出的函数有点'匿名',甚至在d.ts文件中都没有命名,因此我需要手动编辑它.
我的测试用例:
'my-package'提供了一个函数,通常导入为'myPackage':
export = function myPackage(a: string, b: string) { return a + ' ' + b; };
Run Code Online (Sandbox Code Playgroud)
declarationtrue在tsconfig.json中设置为,所以该 …
typescript ×3
cors ×1
dom-events ×1
events ×1
http ×1
http-headers ×1
javascript ×1
overloading ×1
tsd ×1