V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
TomVista
V2EX  ›  问与答

typeScript 声明文件如何书写对象添加 以及 vscod 智能提示的问题

  •  
  •   TomVista · 2019-03-14 10:46:45 +08:00 · 1796 次点击
    这是一个创建于 1841 天前的主题,其中的信息可能已经有所发展或是发生改变。
    add.js
    
    function addSex (object) {
    	object.sex = 'nan'
        
        return object
    }
    
    export{addSex}
    

    main.js
    
    import {addSex} from 'add'
    
    var tom = {name:'tom'}
    
    addSex(tom);
    
    tom.//这里出现 sex 提示符
    
    

    怎么写 add.js 的声明文件或者 jsdoc,官网的教程完全不够日常开发使用. 还是我想多了,根本就没有这个骚操作?

    另外,以下代码中 vscode 找不到对象属性的提示:

    var tom = {name:'tom'};
    
    Object.defineProperty(tom,'sex',{value:'sex',w:true,e:true,c:true})//忘记拼写了
    
    tom.//这里没有 sex 只有 name
    

    谁来拯救下我啊,实在记不住拼写啊

    20 条回复    2019-03-14 17:15:53 +08:00
    yutou527
        1
    yutou527  
       2019-03-14 11:10:00 +08:00   ❤️ 1
    add.d.ts
    ```ts
    declare function addSex(obj: Object): Object;
    ```

    这样?
    yutou527
        2
    yutou527  
       2019-03-14 11:13:06 +08:00   ❤️ 1
    哦 我貌似理解错了
    TomVista
        3
    TomVista  
    OP
       2019-03-14 11:33:37 +08:00
    @yutou527
    我现在用的是
    type fuseType<a,b> = a & b

    interface otherData{
    sex:string
    }

    interface addSex{
    new<data>(obj:data):fuseType<data,otherData>
    }


    这样能够实现智能提示,但是不能表明 参数和返回值之间的关系.
    TomVista
        4
    TomVista  
    OP
       2019-03-14 11:34:51 +08:00
    @yutou527 第二个问题有办法吗?
    yutou527
        5
    yutou527  
       2019-03-14 11:45:54 +08:00   ❤️ 1
    没有找到办法,不知道怎样实现动态的智能提示。
    但是你声明了一个 interface OtherData{sex:string} 的话
    你可以
    ```js
    /**
    * @type {OtherData}
    */
    var tom = {name:'tom'}
    tom.sex
    ```
    来使 js 支持类型推断,可以得到提示
    TomVista
        6
    TomVista  
    OP
       2019-03-14 11:52:14 +08:00
    @yutou527 谢谢,那我先这样做,希望能找到其他方法,要不然写一个新属性都的去注释里加一行.
    maichael
        7
    maichael  
       2019-03-14 11:53:19 +08:00   ❤️ 1
    TS 是静态类型检查自然做不了动态的事情,你这里应该是给 object 写一个 interface,然后有一个可选的 sex 属性。
    TomVista
        8
    TomVista  
    OP
       2019-03-14 12:01:06 +08:00
    @maichael 可选属性确实方便很多,我去补补静态类型检查 动态类型检查
    azh7138m
        9
    azh7138m  
       2019-03-14 12:01:25 +08:00   ❤️ 1
    静态类型+1
    建议同楼上
    maichael
        10
    maichael  
       2019-03-14 12:05:47 +08:00   ❤️ 1
    不过你这里也不是不可以的,它其实并不动态,当然如果你要更动态的需求就不行了。

    ```typescript
    const addText = <T>(object:T) : Test & T => {
    return {
    ...object,
    sex:'text'
    }
    }

    const obj = {a:1}

    const b = addText(obj)

    b.sex
    ```
    maichael
        11
    maichael  
       2019-03-14 12:06:24 +08:00   ❤️ 1
    @maichael #10
    少了个 interface

    ```typescript
    interface Test{
    sex: string
    }
    ```
    viko16
        12
    viko16  
       2019-03-14 12:44:23 +08:00 via Android   ❤️ 1
    你问的不是 ts 的问题,应该是 vscode 写 js 如何做到智能提示吧?

    https://github.com/Microsoft/TypeScript/wiki/JSDoc-support-in-JavaScript
    azh7138m
        13
    azh7138m  
       2019-03-14 12:49:46 +08:00 via Android
    @maichael 你这个是生成了一个新对象,当然是可以的
    maplelin
        14
    maplelin  
       2019-03-14 15:52:07 +08:00
    声明一个对象类型,包含你要添加的属性,可以加?设置为可选属性
    maplelin
        15
    maplelin  
       2019-03-14 15:52:46 +08:00
    这样应该在提示的时候就有对应的属性选项了
    maichael
        16
    maichael  
       2019-03-14 15:56:23 +08:00
    @azh7138m #13 事实上给一个对象添加一个属性是可以看成返回一个新的对象了。
    azh7138m
        17
    azh7138m  
       2019-03-14 16:04:45 +08:00
    @maichael 楼主原本的 addSex 函数是直接修改对象,所以不行,如果是返回一个新对象,那就可以,很简单的事情
    otakustay
        18
    otakustay  
       2019-03-14 17:08:59 +08:00
    ts 就是为了让你别写出这种往已有对象上丢个属性的事情而存在的
    TomVista
        19
    TomVista  
    OP
       2019-03-14 17:12:12 +08:00
    @otakustay 我这个操作严格上应该用原型链继承来实现对吗?
    otakustay
        20
    otakustay  
       2019-03-14 17:15:53 +08:00   ❤️ 1
    @TomVista 应该参考楼上,输入和返回的对象是不同的(因为它们类型本就不同),然后 union type 就可以用了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3012 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 14:56 · PVG 22:56 · LAX 07:56 · JFK 10:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.