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

2019-03-14 10:46:45 +08:00
 TomVista
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

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

1809 次点击
所在节点    问与答
20 条回复
yutou527
2019-03-14 11:10:00 +08:00
add.d.ts
```ts
declare function addSex(obj: Object): Object;
```

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

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

const obj = {a:1}

const b = addText(obj)

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

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

https://github.com/Microsoft/TypeScript/wiki/JSDoc-support-in-JavaScript
azh7138m
2019-03-14 12:49:46 +08:00
@maichael 你这个是生成了一个新对象,当然是可以的
maplelin
2019-03-14 15:52:07 +08:00
声明一个对象类型,包含你要添加的属性,可以加?设置为可选属性
maplelin
2019-03-14 15:52:46 +08:00
这样应该在提示的时候就有对应的属性选项了
maichael
2019-03-14 15:56:23 +08:00
@azh7138m #13 事实上给一个对象添加一个属性是可以看成返回一个新的对象了。
azh7138m
2019-03-14 16:04:45 +08:00
@maichael 楼主原本的 addSex 函数是直接修改对象,所以不行,如果是返回一个新对象,那就可以,很简单的事情
otakustay
2019-03-14 17:08:59 +08:00
ts 就是为了让你别写出这种往已有对象上丢个属性的事情而存在的
TomVista
2019-03-14 17:12:12 +08:00
@otakustay 我这个操作严格上应该用原型链继承来实现对吗?
otakustay
2019-03-14 17:15:53 +08:00
@TomVista 应该参考楼上,输入和返回的对象是不同的(因为它们类型本就不同),然后 union type 就可以用了

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

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

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

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

© 2021 V2EX