拓展微信小程序Component类型定义

39次阅读

共计 1376 个字符,预计需要花费 4 分钟才能阅读完成。

引言
和 ColorUI 一比,原生的导航栏简直是丑的没法看,为了不破坏框架的整体风格,我决定遵从框架的设计,也自定义导航栏。

既然好多个页面都要用到,就考虑一下组件吧!
原生组件
原生的 JavaScript 组件长这样:
Component({
/**
* 组件的属性列表
*/
properties: {
star: {
type: Number,
value: 0
}
},

/**
* 组件的初始数据
*/
data: {
},

/**
* 组件的方法列表
*/
methods: {
init: function () {
}
},

attached: function() {
this.init();
}
});

TypeScript 组件
想着使用 TypeScript 开始写组件,写个 Component 发现没有提示。
咦?官方的 TypeScript API 里没有 Component 方法吗?

找了一圈,也没找见。

打开腾讯官方的小程序仓库,发现赫然一个大 issue,1 月 19 号提的,至今未解决。
很好奇提 issue 的老哥最后是怎么解决的,不能官方库有 bug,我就不写了吧?
探究
看 Page 源码
定义 Page:
Page({})
定义 Component:
Component({})
通过观察,发现 Component 与 Page 两者类似,想着去看看 Page 是怎么定义类型的,我抄过来不就得了?
.d.ts
这是 Page 的类型声明文件,第一次点进去看,这是啥呀,啥也看不懂,一脸懵逼。

最开始啥也不会,新建一个 wx.extend.d.ts 就开始抄代码,抄着抄着我发现我学会了。
/**
* 微信小程序扩展类型 组件 TypeScript
* @author zhangxishuo
*/
declare namespace YunzhiComponent {

/**
* 组件实例对象
* Data: 组件内部属性规范
*/
interface ComponentInstance<Data extends IAnyObject> {
/**
* 组件对外属性
*/
properties?: object | Map<string, object>;

/**
* 组件内部数据
*/
data?: Data;

/**
* 组件内部方法
*/
methods?: object;
}

/**
* 组件构造器
*/
interface ComponentConstructor {
<Data extends IAnyObject = {},
T extends IAnyObject & ComponentInstance<Data> = {}> (
options: ComponentInstance<Data> & T
): void
}
}

declare const Component : YunzhiComponent.ComponentConstructor;
总结
之前也不知道.d.ts,现在写了之后,发现其实也没什么,这个文件就是写 TypeScript 会有代码提示,编译的时候提示提示类型,其实最终的功能,和.d.ts 文件没啥关系。
宝剑锋自磨砺出,梅花香自苦寒来。
996.ICU 要数当前最火的话题了,为什么要 996 呢?
加班了,生产力一定提升吗?写代码是一个神奇的工作,同样一个功能,一个小时是它,三个小时也是它,如果你让他加班呢?他会怎么选呢?除非必要,永远不要加班,因为他们会把工作都留到晚上。
程序员为什么不去多想想,为什么我要在这里加班?记住,世界是公平的。
一句话,加班不推荐。但如果生产力低,不加班怎么办呢?

正文完
 0