在此代码段中,语句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) 我有以下代码片段:
...
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(...抛出错误.
我的问题,为什么打字稿不会打印出一些警告或错误?
通过可以安装全局软件包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。
我正在使用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()方法在内部调用并导致我看到的错误.
'Content-Type': 'application/json'.这导致HTTP PUT请求标头Accept:application/json, text/plain, */*).
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: ...