Q: 请教一个关于 JS 类型的问题?

2023-09-20 17:35:01 +08:00
 c3de3f21

Intro

例子代码类似如下

 log(logObj) {
    const consoleLogFn = this._getLogFn(logObj.level);

    // Type
    const type = logObj.type === 'log' ? '' : logObj.type;

    // Tag
    const tag = logObj.tag || '';

    // Styles
    const color =
      this.typeColorMap[logObj.type] ||
      this.levelColorMap[logObj.level] ||
      this.defaultColor;
    const style = `
      background: ${color};
      border-radius: 0.5em;
      color: white;
      font-weight: bold;
      padding: 2px 0.5em;
    `;

    const badge = `%c${[tag, type].filter(Boolean).join(':')}`;

    // Log to the console
    if (typeof logObj.args[0] === 'string') {
      consoleLogFn(
        `${badge}%c ${logObj.args[0]}`,
        style,
        // Empty string as style resets to default console style
        '',
        ...logObj.args.slice(1)
      );
    } else {
      consoleLogFn(badge, style, ...logObj.args);
    }
  }

Question

1679 次点击
所在节点    JavaScript
11 条回复
iOCZ
2023-09-20 17:49:54 +08:00
对于脚本语言而言,就是没有。。。如果你要类型,就要额外的编译器支持。除了用 TS ,以前还有 flow 这种东西。
c3de3f21
2023-09-20 17:52:58 +08:00
@iOCZ 啊~~~好吧
codehz
2023-09-20 19:43:27 +08:00
怎么能说没有呢
虽然没有标注,但是你可以根据使用情况和作者预期推断需要的数据形状( shape ),甚至于 flow 和 ts 都有提供自动根据使用情况推断的工具,自动的准不准确另说,但起码能用
此外即使文件是 js ,你依旧可以通过 jsdoc 来注释类型,而且 ts 是支持这样的 https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html
lzgshsj
2023-09-20 20:31:00 +08:00
纯 js 想要使用者好懂,就需要开发者花时间写详细的 jsdoc 或者.d.ts 声明文件。编辑器和 IDE 是可以通过 jsdoc 和.d.ts 文件智能提示类型的。
DOLLOR
2023-09-20 20:41:39 +08:00
0 、不像用 TS 就用 jsdoc + ts-check
1 、如何规定参数类型: https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#param-and-returns

不要小瞧 jsdoc ,在 vscode 里开 ts-check ,已经能达到 TS 八成功力了。
aikilan
2023-09-20 21:14:24 +08:00
楼上说的对,日常 jsdoc 也够
subframe75361
2023-09-20 21:31:58 +08:00
ts 最有用的是类型推断和函数重载,其他的基本 jsdoc 就行
jones2000
2023-09-20 22:27:34 +08:00
f12 直接调试就能看到整个 logObj 的信息了。js 本来就是一个轻量型的开发, 一个记事本+浏览器就可以完成开发。 非要搞这么复杂, 最后还不是转成 js 执行。
jiejiss
2023-09-21 15:27:12 +08:00
jsdoc 表达能力很强。所有 ts types 功能里面,jsdoc 不支持的应该只有 declaration merging
c3de3f21
2023-09-21 15:43:40 +08:00
@jiejiss 是不是这种
```
/**
* @typedef {Logger & Object.<LogType,LogFn>} LoggerInstance
*/

```
humbass
2023-10-04 16:13:44 +08:00
我们其实是另一种方式来解决这个问题,写一份专门的文档,来解释需要交互的 API 具体参数内容。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/975611

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX