成功编译了我的TypeScript项目之后,我打算在VS Code的调试模式下运行它ts-node.问题是,ts-node找不到d.ts我创建的文件(虽然tsc它没有问题).
项目结构是:
/
conf/
dist/
src/
types/
package.json
tsconfig.json
Run Code Online (Sandbox Code Playgroud)
tsconfig.json 相关条目是:
{
"compilerOptions": {
"target": "es2017",
"module": "commonjs",
// "lib": [],
"sourceMap": true,
"outDir": "dist",
"rootDir": "src",
"moduleResolution": "node",
"baseUrl": ".",
"paths": {
"*": [
"node_modules/*",
"src/types/*"
]
},
// "rootDirs": [],
// "typeRoots": [],
// "types": [],
},
"include": [
"src/**/*"
]
}
Run Code Online (Sandbox Code Playgroud)
定义文件ts-node找不到的是src/types/global.d.ts:
import { App } from '../App';
declare global {
namespace NodeJS { …Run Code Online (Sandbox Code Playgroud) 在 TypeScript 的装饰器参考页面上,有一段代码被截断,说明如何使用类装饰器覆盖构造函数:
function classDecorator<T extends {new(...args:any[]):{}}>(constructor:T) {
return class extends constructor {
newProperty = "new property";
hello = "override";
}
}
@classDecorator
class Greeter {
property = "property";
hello: string;
constructor(m: string) {
this.hello = m;
}
}
console.log(new Greeter("world"));
Run Code Online (Sandbox Code Playgroud)
并在日志中:
class_1 {
property: 'property',
hello: 'override',
newProperty: 'new property' }
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。但是尝试newProperty通过点符号访问失败:
类型“Greeter”.ts(2339) 上不存在属性“newProperty”
错误并且未在 VS Code 的提示中列出。可以通过括号表示法访问它,但 TS 警告说
元素隐式具有 'any' 类型,因为类型 'Greeter' 没有索引签名。 ts(7017)
我错过了什么吗?如何以类型安全的方式通过装饰器实现添加新属性?我想像普通的类成员一样拥有普通的编译器支持。
我有一个类层次结构,如:
|-> Square
AbstractShape -+-> Circle
|-> Triangle
Run Code Online (Sandbox Code Playgroud)
现在,我想实现策略模式并创建一个存储在字符串中的类对象.在PHP中我会使用:
$type = 'Square';
$obj = new $type();
Run Code Online (Sandbox Code Playgroud)
Node.js中有等价物吗?
我需要一个控制器操作:
前两点很简单,我用AuthGuardthen class-validator。但我不知道如何返回 HTTP 响应然后继续处理。
由于请求由一系列(可能是长时间运行的)任务组成,我想到了使用拦截器使用 RxJS 来观察任务的状态并在任务完成后调用外部 PI。但是,我没有使用 RxJS 或拦截器(不是这种方式)的经验,所以我真的不知道如何让拦截器的进程运行,但立即将控制权传递给控制器的操作。
另外,也许还有另一种更好的方法?没有拦截器,只是把所有的流程逻辑放在控制器中?还有其他选择吗?
javascript asynchronous long-running-processes node.js nestjs
我需要向外部服务器发出 HTTP GET 请求才能开始接收事件。请求后我立即得到multipart/x-mixed-replace回复。当事件发生时,它会作为 XML 消息与指示该部分结束的边界一起发送。
现在我必须在 Node.js 中实现它。对于正常请求,我使用node-rest-client,调用其get()方法并将我的逻辑放入方法的回调中。问题是回调仅在响应完成时执行,并且multipart/x-mixed-replace直到连接关闭时才会执行。
还有其他 NPM 模块可以做到这一点吗?我搜索了 NPM 注册表,但发现结果似乎不适合该任务。还是在纯 Node 中完成更好?我就是这样,请举个例子。
我有一个从对象获取属性的函数。
// Utils.ts
export function getProperty<T, K extends keyof T>(obj: T, key: string): T[K] {
if (key in obj) { return obj[key as K]; }
throw new Error(`Invalid object member "${key}"`);
}
Run Code Online (Sandbox Code Playgroud)
我想检查返回的属性是否是具有给定签名的函数,然后使用提供的参数调用该属性。
getProperty()用于动态获取对象的方法之一并调用它。我试过:
let property: this[keyof this] = utils.getProperty(this, name);
if (typeof property === 'function') ) { property(conf); }
Run Code Online (Sandbox Code Playgroud)
但这给出了“无法调用类型缺少调用签名的表达式。类型'any'没有兼容的调用签名。” 错误。我知道来自的属性getProperty()确实可以是任何类型,但如何确定它是带有(conf: {}): void签名的函数?
我需要根据用户的关键字过滤实体。假设用户输入“12”,我需要查找在定义的文本字段、ID 或日期中具有该“12”的所有实体。
目前我有这样的表达:
$qb = $em->createQueryBuilder();
$qb->select('entity')
->from('streets', 'street')
->join('street.zone', 'zone')
->join('zone.city', 'city')
->orWhere('LOWER(zone.name) LIKE :query')
->orWhere('LOWER(city.name) LIKE :query')
->orWhere('LOWER(street.name) LIKE :query')
->orWhere('street.id LIKE :query')
->orWhere('street.lastUpdated LIKE :query')
->setParameter('query', '%'.strtolower($searchQuery).'%')
;
Run Code Online (Sandbox Code Playgroud)
我对字符串没有问题,但日期和整数会导致类型不匹配 - 最后两个orWheres 会导致错误。如何在 DQL 中将这些整数和日期转换为字符串?我不能这样做,->orWhere('street.id = :query')因为用户可以输入“街道”搜索词。
node.js ×3
typescript ×3
javascript ×2
asynchronous ×1
casting ×1
decorator ×1
dql ×1
mixins ×1
nestjs ×1
stream ×1
ts-node ×1
typechecking ×1