Q: 请教一个关于 JS 类型的问题? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
c3de3f21
V2EX    Javascript

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

  •  
  •   c3de3f21 2023-09-20 17:35:01 +08:00 2108 次点击
    这是一个创建于 753 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Intro

    • 0.首先在不使用 ts 的情况下讨论问题

    例子代码类似如下

     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); } } 
    • 1.这是一段 console.log 的包装函数,通过读以下代码,我们好像无法理会它的意思
    • 2.首先第一个问题 logObj 就难住了调用者,这个 logObj 是什么,有什么属性,每个属性是做什么用的?
      • 我们可以通过 JSDoc 的方式来不太良好的解决这个问题,也可以通过注释说明,但是编辑器可不会推断出对象中的属性都有些什么
    • 3.在我们使用 React 的纯 JS 时,PropType 可以帮助我们规定每个组件中的 this.props 属性类型

    Question

    • 0.如何只使用 JS 或者 JS 第三方库来写出好的代码(代码消费者好懂,代码生产者工作量少)?
    • 1.如何规定参数的类型?或者说给我们的 JS 一些小小的约束?
    第 1 条附言    2023-09-21 09:58:53 +08:00
    感谢各位的解答和各位的经验

    结论: 使用 JSDOC 好好写,编辑器可以根据 DOC 推断出属性。
    11 条回复    2023-10-04 16:13:44 +08:00
    iOCZ
        1
    iOCZ  
       2023-09-20 17:49:54 +08:00
    对于脚本语言而言,就是没有。。。如果你要类型,就要额外的编译器支持。除了用 TS ,以前还有 flow 这种东西。
    c3de3f21
        2
    c3de3f21  
    OP
       2023-09-20 17:52:58 +08:00
    @iOCZ 啊~~~好吧
    codehz
        3
    codehz  
       2023-09-20 19:43:27 +08:00   1
    怎么能说没有呢
    虽然没有标注,但是你可以根据使用情况和作者预期推断需要的数据形状( shape ),甚至于 flow 和 ts 都有提供自动根据使用情况推断的工具,自动的准不准确另说,但起码能用
    此外即使文件是 js ,你依旧可以通过 jsdoc 来注释类型,而且 ts 是支持这样的 https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html
    lzgshsj
        4
    lzgshsj  
       2023-09-20 20:31:00 +08:00
    纯 js 想要使用者好懂,就需要开发者花时间写详细的 jsdoc 或者.d.ts 声明文件。编辑器和 IDE 是可以通过 jsdoc 和.d.ts 文件智能提示类型的。
    AV1
        5
    AV1  
       2023-09-20 20:41:39 +08:00   1
    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
        6
    aikilan  
       2023-09-20 21:14:24 +08:00
    楼上说的对,日常 jsdoc 也够
    subframe75361
        7
    subframe75361  
       2023-09-20 21:31:58 +08:00
    ts 最有用的是类型推断和函数重载,其他的基本 jsdoc 就行
    jones2000
        8
    jones2000  
       2023-09-20 22:27:34 +08:00
    f12 直接调试就能看到整个 logObj 的信息了。js 本来就是一个轻量型的开发, 一个记事本+浏览器就可以完成开发。 非要搞这么复杂, 最后还不是转成 js 执行。
    jiejiss
        9
    jiejiss  
       2023-09-21 15:27:12 +08:00 via Android
    jsdoc 表达能力很强。所有 ts types 功能里面,jsdoc 不支持的应该只有 declaration merging
    c3de3f21
        10
    c3de3f21  
    OP
       2023-09-21 15:43:40 +08:00
    @jiejiss 是不是这种
    ```
    /**
    * @typedef {Logger & Object.<LogType,LogFn>} LoggerInstance
    */

    ```
    humbass
        11
    humbass  
       2023-10-04 16:13:44 +08:00
    我们其实是另一种方式来解决这个问题,写一份专门的文档,来解释需要交互的 API 具体参数内容。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     819 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 21:29 PVG 05:29 LAX 14:29 JFK 17:29
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86