小编ice*_*itz的帖子

JSDoc 内联对象 typedef

有没有一种方法可以将复杂对象的 typedef 写入内联对象键而不是全部放在一个块中?例如,根据 JSDoc 文档https://jsdoc.app/tags-property.html,可以:

/**
 * Config type definition
 * @typedef {Object} Config
 * @property {string} prop1
 * @property {string} [prop2]
 */
let Config = {
     prop1: 'value1',
     prop2: 'value2',
};
Run Code Online (Sandbox Code Playgroud)

变成这样:

/**
 * Config type definition
 * @typedef {Object} Config
 */
let Config = {
     /** @property {string} prop1 */
     prop1: 'value1',
     /** @property {string} [prop2] */
     prop2: 'value2',
};
Run Code Online (Sandbox Code Playgroud)

我已经尝试过各种标签组合,例如 @namespace、@typedef、@member、@memberof 等,但我无法通过尝试任何一种在一个 JSDoc 块中声明所有内容时获得漂亮的属性表。内联格式的标签组合。

在一个块中定义 typedef 是可以的,直到您尝试定义一个跨越数百行的巨大配置对象。必须跳到文件顶部才能找到该键的属性描述,非常麻烦。

javascript node.js jsdoc

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

由于私有名称的使用,声明不会发出

我正在尝试将一个项目转换为 TypeScript,并且我已经设置了大部分内容,但我仍在努力将最后几部分放在一起。我希望能够从普通的 JavaScript 项目中使用这个 TypesScript 项目,所以我的理解是我需要为我现有的源发出 d.ts 文件。我的源目前都是 .js,我们计划随着时间的推移慢慢迁移到 TS。我的问题是让声明与当前的导出/要求语句一起发出。

问题的简单演示:

mod1.js

class MyClass {
    constructor(name) {
        this.name = name;
    }
}

module.exports = {
    MyClass,
};
Run Code Online (Sandbox Code Playgroud)

mod2.js

const mod1 = require('./mod1');

module.exports = {
    MyClass: mod1.MyClass,
};
Run Code Online (Sandbox Code Playgroud)

一旦我尝试在 mod2 中导出 MyClass 以重新路由一个可以在使用项目时访问 MyClass 的命名空间,我就会得到 Declaration emit for this file requires using private name 'MyClass' from module '"mod1"'. An explicit type annotation may unblock declaration emit.ts(9006)

我们的代码库中有很多重新路由,包含各种类的文件组,然后我们在每个目录级别使用 index.js 文件来定义该命名空间中哪些项目可用,有时还有一堆 UI 元素它们是实例化的类实例,因此我们可以进行如下调用:

const {app, appui} = require('our-cool-app');
app.feature1.doSomething();
appui.component.someButton.click();
Run Code Online (Sandbox Code Playgroud)

是否有一个简单的修复方法可以让我们的 d.ts …

javascript typescript tsc

6
推荐指数
2
解决办法
3577
查看次数

np.dot 3x3,带有 N 个 1x3 数组

我有一个 N 1x3 数组的 ndarray 我想与 3x3 矩阵执行点乘法。我似乎无法找到一种有效的方法来做到这一点,因为所有 multi_dot 和 tensordot 等方法似乎都是递归求和或乘以每个操作的结果。我只想像应用标量一样应用点乘法。我可以使用 for 循环或列表理解来完成此操作,但对于我的应用程序来说太慢了。

N = np.asarray([[1, 2, 3], [4, 5, 6], [7, 8, 9], ...])
m = np.asarray([[10, 20, 30], [40, 50, 60], [70, 80, 90]])
Run Code Online (Sandbox Code Playgroud)

我想执行类似这样的操作,但没有任何 python 循环:

np.asarray([np.dot(m, a) for a in N])
Run Code Online (Sandbox Code Playgroud)

这样它就简单地返回[m * N[0], m * N[1], m * N[2], ...]

最有效的方法是什么?有没有办法做到这一点,以便如果 N 只是一个 1x3 矩阵,它只会输出与 np.dot(m, N) 相同的结果?

python numpy matrix linear-algebra array-broadcasting

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

NPM 包包括 .DS_Store

根据文档https://docs.npmjs.com/files/package.json#files,如果将目录放在package.jsonfiles部分中,则无论如何都会排除指定目录中的某些文件 - 包括. DS_Store。此外,.gitignore.npmignore中的文件应排除package.json文件部分中指定的任何目录内的文件。

我的package.json files条目是["src", "bin"],但是当我运行时,src中的.DS_Store文件仍然进入 tarball 中。.DS_Store也在.gitignore中,但无论设置如何,npm 都应该排除它。npm pack

README.md文件已正确自动包含,但如果不明确包含我想要包含在package.json部分中的所有文件扩展名,我就无法让.DS_Store消失。files

我尝试了 NPM 6.4.1 和 6.9.0 并得到了相同的结果,我在这里遗漏了什么吗?

pack npm

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

允许多个不同形状的接口作为 TypeScript 返回类型

我有一个函数,它接受一些参数并生成将传递到外部进程的对象。因为我无法控制最终需要创建的形状,所以我必须能够为我的函数采用一些不同的参数并将它们组装成适当的对象。这是一个非常基本的示例,展示了我遇到的问题:

interface T1A {
    type: 'type1';
    index: number;
}

interface T1B {
    type: 'type1';
    name: string;
}

interface T2A {
    type: 'type2';
    index: number;
}

interface T2B {
    type: 'type2';
    name: number;
}

function hello(type: 'type1' | 'type2'): T1A | T1B | T2A | T2B {
    return {type, index: 3}
}
Run Code Online (Sandbox Code Playgroud)

这个特定的函数抱怨“type1”不能分配给“type2”。我读了一些有关类型保护的内容,并弄清楚了如何使这个简单的示例变得快乐:

function hello(type: 'type1' | 'type2'): T1A | T1B | T2A | T2B {
    if (type === 'type1') {
        return {type, index: 3}
    } else {
        return {type, index: …
Run Code Online (Sandbox Code Playgroud)

interface unions typescript typeguards

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

TypeScript 通用映射可变参数元组值到嵌套映射类型

我正在尝试创建一个辅助函数,它采用 JSON 等嵌套对象,并允许在任意深度制作嵌套值的深层副本。我了解可变元组类型,并且可以让它们仅用于传递元组 - 但我不知道如何将它们“映射”到任意深度的嵌套选择(甚至可能不可能)。这是我想出的最好的方法 - 但仍然仅限于需要为 GetNestedValue 创建尽可能多的重载,因为我愿意支持。我理解各种错误,我只是想不出任何方法来满足编译器并在返回值上获得类型完成。

// K is arbitrary length how to express N accessors deep? in TS without a loop?
type GetNestedValue<K extends string[], O extends any> = O[K[0]][K[1]][K[2]];

function getNestedItem<Keys extends string[], Obj>(
    obj: Obj, ...keys: readonly [...Keys]
): GetNestedValue<Keys, Obj> extends undefined ? undefined : GetNestedValue<Keys, Obj> {
    let level: any = obj;
    for (const key of keys) {
        if (level !== undefined) {
            level = level[key];
        } else {
            return;
        }
    } …
Run Code Online (Sandbox Code Playgroud)

typescript mapped-types variadic-tuple-types

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