TypeScript salsa中是否有支持jsdoc的polyfill?

ycggw6v2  于 6个月前  发布在  TypeScript
关注(0)|答案(9)|浏览(144)

假设我正在实现

Array.prototype.last = function() {
    return this[this.length - 1];
};

并且希望它出现在智能感知中。我应该怎么做?
如果它不存在,我们是否应该有这个功能?

rdlzhqv9

rdlzhqv91#

Why not use a .d.ts file?

interface Array<T> {
  last(callbackfn?: (value: T) => boolean): T | undefined;
}
bvjveswy

bvjveswy2#

首先,因为它是用Node.js编写的。我们不能在启动时有全局代码(或者可以吗?我可能在这里弄错了)
所以有可能数组原型还没有被我的polyfill函数设置
这就是为什么我需要它成为局部的,只在一个实现这个功能的文件中(以及一个引用这个文件的文件)
其次,我不喜欢包含TypeScript和JavaScript的项目。所以我希望避免自己编写不受typings管理器管理的.d.ts。我想先找到一种解决方案。

x7rlezfr

x7rlezfr3#

You can have global code on startup. Just import the side effecting code before anything else.

// src/index.js

require('./last').imbue();

// now you have Array.prototype.last available everywhere.
// last.js

module.exports = {
  imbue: function () {
    if (Array.prototype.last) return;

    Array.prototype.last = function (predicate) { 
      const source = predicate ? this.filter(predicate) : this;
      return source[source.length - 1]; 
    };
  }
};
k2fxgqgv

k2fxgqgv4#

@aluanhaddad 的要求不是全局的,它只能影响一个文件。虽然我们可能有很多文件并调用 node indexjsnode default.jsnode $filename
实际上我也在使用这个解决方案,因为我的服务器只有一个端点,在顶层处理所有传入的请求。
但这仍然让我感到困扰,因为它在两个地方产生依赖关系,当我可能有更多的端点时,这可能会变得危险。

niwlg2el

niwlg2el5#

我不明白它还能如何工作。如果你使用不同的入口点,你也需要在那里进行填充。我理解你不想这样做的原因,但我不确定有什么可以做的,这就是JavaScript和TypeScript的本质。

3hvapo4f

3hvapo4f6#

如果没有计划的话,我希望它能成为一个功能请求。

在Node.js应用程序启动时,我们不能加载全局事物。因此,我希望我们可以在实现点编写jsdoc,以便仅在实际在该文件中或需要时填充。

假设我有3个文件。我在第一个文件中实现了数组的扩展,所以我希望看到它在那一个文件中。

#1st file
/** @memberOf {Array.prototype} < I think memberOf is expected syntax of jsdoc for this feature */
Array.prototype.last = function() { return this[this.length - 1]; }

[0,1,2].las // <<< Wish to see intellisense here

#2nd file
var firstFile = require("./1stFile.js");

["T","e","s","t"].las // <<< Wish to see intellisense here too if possible

#3rd file

["T","e","s","t"].las // <<< Should not see intellisense here because it not implemented and was not made require to any file implement it

这个功能的实现可能与您建议的TypeScript相同?
如果有@memberOf呈现,那么它将只是将这段代码注入到salsa中。
或者这是不可能的?

p3rjfoxz

p3rjfoxz7#

这取决于编译上下文中包含的文件以及全局声明的性质。由于您正在使用JavaScript,我不认为您能够完全表达这种条件性。我认为 memberof 是正确的JSDoc注解,但我不认为它目前受到支持。
就我个人而言,我认为如果您需要这些高度表达式的类型构造(例如模块范围内的全局增强),您应该使用TypeScript。JSDoc在这方面很糟糕。TypeScript之所以被创建,就是为了解决这个问题。JSDoc的描述不够明确,存在多个相互竞争的解释,如JetBrains、谷歌闭包等,而且非常丑陋。它还无法在类型和值之间提供对应关系。
此外,如果您在使用谷歌的工具和TypeScript时使用JSDoc,您将遇到麻烦,因为闭包通过试图强制执行一种约定来解释JSDoc,即JavaScript是一种类似Java的语言,而TypeScript正确地将JavaScript解释为JavaScript。

mkshixfv

mkshixfv8#

@aluanhaddad

有时候是需要的,而我没有选择。如果可以选择的话,我只会使用C#。如果它无论如何都能编译,那么C#比TypeScript更好。但是我被JavaScript困住了,现在不是将我的代码库转换为C#或TypeScript的时候。

我认为jsdoc本身做得很出色,因为它可以涵盖在JavaScript中定义类型的各个方面,并让IDE尝试从其中构建智能感知。这涉及到每个工具的实现。即使在C#中,不同的IDE也会有所不同。它并不那么标准,当我在使用js和jsdoc时,我更喜欢使用salsa工具。

我使用js和salsa的主要原因是,如果将来salsa和vscode都消失了,我可以回到使用文本编辑器编写JavaScript。salsa只是具有智能感知的最佳工具之一。任何试图做的不仅仅是智能感知的工具,对我来说都不值得一试。

到目前为止,我认为salsa是一个非常精致的解决方案(这就是我主要选择使用它的原因)。我认为如果salsa完全实现了jsdoc的功能,那么@memberOf应该能像我期望的那样工作。

csbfibhn

csbfibhn9#

TLDR; TypeScript 不会消失,只要 JavaScript 存在就会继续存在
TypeScript 会一直可用,除非 npm、GitHub 以及其他拥有最新副本的计算机死亡。
为了强调这一点,我经常在浏览器中转译我的 TypeScript。
我在那里托管它,并使用 VS Code 进行编辑,在那里托管相同的版本。TypeScript 是一种 JavaScript 程序,只要我有可用的 JavaScript VM,我知道我的 TypeScript 将是可编译的代码。

Node

PS C:\Source> node
> var ts = require('C:/Users/Aluan/AppData/Roaming/npm/node_modules/typescript');
undefined
> var js = ts.transpileModule("export default function (x: number, y: number): number { return x * y; }", { compilerOptions: { module: ts.ModuleKind.CommonJS } });
undefined
> js
{ outputText: '"use strict";\r\nfunction default_1(x, y) { return x * y; }\r\nexports.__esModule = true;\r\nexports["default"] = default_1;\r\n',
  diagnostics: [],
  sourceMapText: undefined }
> var fs = require('fs');
undefined
> fs.writeFileSync('./multiply.js', js.outputText);
undefined
>
(To exit, press ^C again or type .exit)
>
PS C:\Source> notepad.exe .\multiply.js
PS C:\Source>

PS C:\Source> node
> var multiply = require('./multiply.js');
undefined
> multiply.default(4, 6)
24
>
(To exit, press ^C again or type .exit)
>
PS C:\Source>

Browser

SystemJS.config({packages:{ 'https://cdnjs.cloudflare.com/ajax/libs/typescript/2.0.10/typescript.js' :{format:'global', exports:['ts']}}})

SystemJS.import("https://cdnjs.cloudflare.com/ajax/libs/typescript/2.0.10/typescript.js")
    .then(function () {
        return ts.transpileModule("export default function (x: number, y: number): number { return x * y; }", {
            compilerOptions: {
                module: ts.ModuleKind.CommonJS
            }
        }).outputText;
    }).then(console.log.bind(console));
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
"use strict";
function default_1(x, y) { return x * y; }
exports.__esModule = true;
exports["default"] = default_1;

相关问题