小编Man*_*ner的帖子

为什么instanceof在这里评估为true?

在此代码段中,语句f instanceof PipeWritable返回true(Node v8.4.0):

const stream = require('stream');
const fs = require('fs');

class PipeWritable extends stream.Writable {
    constructor () {
        super();
    }
}

const s = new PipeWritable();
const f = fs.createWriteStream('/tmp/test');

console.log(f instanceof PipeWritable); // true ... ???
Run Code Online (Sandbox Code Playgroud)

对象s:

  • Object.getPrototypeOf(s) 是 PipeWritable {}
  • s.constructor 是 [Function: PipeWritable]
  • PipeWritable.prototype 是 PipeWritable {}

对象f:

  • Object.getPrototypeOf(f) 是 WriteStream { ... }
  • f.constructor 是 [Function: WriteStream] ...
  • stream.WriteStream.prototype 是 Writable { ... }

原型链:

Object f …
Run Code Online (Sandbox Code Playgroud)

javascript node.js ecmascript-6

18
推荐指数
1
解决办法
515
查看次数

Typescript不会检测类型错误

我有以下代码片段:

文件router-data.ts#L46

...
const fd = FroniusMeter.getInstance(req.query.address ? req.query.address : 1);
....
Run Code Online (Sandbox Code Playgroud)

该方法getInstance()在文件fronius-meter.ts#L51中定义

public static getInstance (id: string): FroniusMeter {
    if (id.startsWith('/dev')) {
        debug.info('...');
    }
    let rv = ModbusDevice.getInstance(id);
    if (!rv) {
        rv = ModbusDevice.instances.find( (d) => (d instanceof FroniusMeter) && (d.address === +id) );
    }
    return rv instanceof FroniusMeter ? rv : null;
}
Run Code Online (Sandbox Code Playgroud)

在没有警告或错误(tsconfig.json)的情况下编译源代码,但执行会抛出异常TypeError: id.startsWith is not a function.

原因很清楚,调用getInstance()使用数字作为参数,但该方法是为字符串编写的参数.因此id.startsWith(...抛出错误.

我的问题,为什么打字稿不会打印出一些警告或错误?

typescript

9
推荐指数
2
解决办法
114
查看次数

如何在Typescript中使用全局Node包

通过可以安装全局软件包npm install -g ...。
如果以这种方式安装了Typescript类型,则它们也可以在全局文件夹中使用,例如/usr/lib/node_modules在linux系统上。

使用tsc转换打字稿源文件时,会输出编译器错误,并且转换失败。

src/main.ts(3,26): error TS2307: Cannot find module 'express'.

但是,我希望像这样的环境变量NODE_PATH或tsconfig.json像这样的文件中的配置设置

{
    "compilerOptions": {
        ...
        "typeRoots": [
             "/usr/lib/node_modules/@types"
        ]
     }
}
Run Code Online (Sandbox Code Playgroud)

可以解决该问题(另请参见Typescript文档)。

但是所有这些设置都将被忽略。仅在项目中本地安装类型会有所帮助。

所以我的问题是,为什么设置tsconfig.json会被忽略?是否有可能使用全局安装的类型包

示例项目:

之后npm install,你可以运行这个项目,npm start如果所有其他依赖在全球范围内安装。仅安装了以下7个软件包:

"devDependencies": {
    "@types/express": "^4.0.38",
    "@types/node": "^8.0.31",
    "@types/sprintf-js": "^1.1.0"
 }
Run Code Online (Sandbox Code Playgroud)

如果我删除本地目录,node_modules则会收到错误消息

src/main.ts(2,25): error TS2307: Cannot find module 'sprintf-js'.
src/main.ts(3,26): error TS2307: Cannot find module 'express'.
Run Code Online (Sandbox Code Playgroud)

...尽管这些软件包在全局软件包文件夹中可用/usr/lib/node_modules。

typescript

5
推荐指数
2
解决办法
1116
查看次数

Angular 4 http在没有正文的PUT响应中抛出错误

我正在使用Angular http模块v4.4.6.当Angular应用程序(客户端)向HttpClient服务器发送PUT请求(使用),并且服务器响应状态200(OK)而没有正文中的任何数据时,角度http模块抛出一个HttpErrorResponse.

这是一个正确的功能还是一个错误?
如何在没有任何数据的情况下处理PUT响应?


详细地:

在最近的版本中,我使用了普通Http模块,它的方法是put().在那里,我需要调用res.json()以获取正文中的JSON数据.put()方法返回Observable<Response>.

现在我使用更新的HttpClient和它的put()方法.此方法返回Observable<Object>.似乎该json()方法在内部调用并导致我看到的错误.

  • Angular客户端使用HttpHeader创建PUT请求'Content-Type': 'application/json'.这导致HTTP PUT请求标头Accept:application/json, text/plain, */*).
  • 服务器以状态200(OK)回答,并且正文中没有任何数据.
  • Angular客户端收到答案并抛出错误.

HttpErrorResponse {headers: HttpHeaders, status: 200, ... error: error: SyntaxError: Unexpected end of JSON input at .. text: "" headers: HttpHeaders {normalizedNames: Map(0), lazyUpdate: ... message: "Http failure during parsing for ... name: "HttpErrorResponse" ok: false status: 200 statusText: "OK" url: ...

http angular

1
推荐指数
1
解决办法
7235
查看次数

标签 统计

typescript ×2

angular ×1

ecmascript-6 ×1

http ×1

javascript ×1

node.js ×1