小编For*_*eti的帖子

当tsc成功编译项目时,ts-node忽略d.ts文件

成功编译了我的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 typescript-typings ts-node

16
推荐指数
5
解决办法
4553
查看次数

通过 TypeScript 中的装饰器向类添加属性

在 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)

我错过了什么吗?如何以类型安全的方式通过装饰器实现添加新属性?我想像普通的类成员一样拥有普通的编译器支持。

decorator mixins typescript

13
推荐指数
2
解决办法
7478
查看次数

Node.js - 创建变量中指定的类名对象

我有一个类层次结构,如:

               |-> Square
AbstractShape -+-> Circle
               |-> Triangle
Run Code Online (Sandbox Code Playgroud)

现在,我想实现策略模式并创建一个存储在字符串中的类对象.在PHP中我会使用:

$type = 'Square';
$obj = new $type();
Run Code Online (Sandbox Code Playgroud)

Node.js中有等价物吗?

javascript strategy-pattern node.js

7
推荐指数
2
解决办法
3987
查看次数

如何返回 202 Accepted 然后在 Nest.js 中继续处理请求

我需要一个控制器操作:

  1. 授权调用
  2. 验证它
  3. 返回 202 Accepted 状态
  4. 继续处理请求
  5. 使用先前接受和现在处理的请求的结果调用外部 API。

前两点很简单,我用AuthGuardthen class-validator。但我不知道如何返回 HTTP 响应然后继续处理。

由于请求由一系列(可能是长时间运行的)任务组成,我想到了使用拦截器使用 RxJS 来观察任务的状态并在任务完成后调用外部 PI。但是,我没有使用 RxJS 或拦截器(不是这种方式)的经验,所以我真的不知道如何让拦截器的进程运行,但立即将控制权传递给控制器​​的操作。

另外,也许还有另一种更好的方法?没有拦截器,只是把所有的流程逻辑放在控制器中?还有其他选择吗?

javascript asynchronous long-running-processes node.js nestjs

7
推荐指数
2
解决办法
2420
查看次数

在 Node.js 中发出 HTTP 请求并接收 multipart/x-mixed-replace 响应

我需要向外部服务器发出 HTTP GET 请求才能开始接收事件。请求后我立即得到multipart/x-mixed-replace回复。当事件发生时,它会作为 XML 消息与指示该部分结束的边界一起发送。

现在我必须在 Node.js 中实现它。对于正常请求,我使用node-rest-client,调用其get()方法并将我的逻辑放入方法的回调中。问题是回调仅在响应完成时执行,并且multipart/x-mixed-replace直到连接关闭时才会执行。

还有其他 NPM 模块可以做到这一点吗?我搜索了 NPM 注册表,但发现结果似乎不适合该任务。还是在纯 Node 中完成更好?我就是这样,请举个例子。

stream multipart-mixed-replace node.js

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

TypeScript - 检查对象的属性是否是具有给定签名的函数

我有一个从对象获取属性的函数。

// 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签名的函数?

typechecking function-signature typescript

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

在 DQL 中将整数和日期转换为字符串

我需要根据用户的关键字过滤实体。假设用户输入“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')因为用户可以输入“街道”搜索词。

casting dql

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