钉钉背后的故事(1)— Typescript 解决复杂数据结构

dingding.jpeg

我最近也是一直在做办公系统,所以自然也少不了关注竞争对手,其中少不了阿里的钉钉,钉钉最初只有 4 个前端,继续 nw.js 开发出他们的第一版桌面应用,可能是因为没有 native 工程师吧。先来看看,nw.js 我接触还是比较早,还是 2015 我就做了个 Demo。2016 年底实际做了一个项目,用这个封装了web 的即时通讯打包成 Mac 和 window 版本桌面。

web 框架钉钉最初用得就是 angular,现在好像也使用 react。angular 我接触的比较早,好时候正好闲着在家接触 google 最新版的 angular2。因为之前已经接触过一段 javascript 也用过 jquery 做过一些项目。不过 angular2 完全推翻了我对 javascript 的认知,以及对前端 web 应用开发过程认知。我通过学习 angular2 到现在回头看收益匪浅。然后就开始学习了 react。

typescript 我也是接触比较早的,angular2 需要用 typescript 开发,所以才边学 angular 变学 typescript 的。typescript 是 c# 语言架构师设计的。当初还不了解为什么要用 typescript,随着不断学习现在逐渐了解为什么使用 typescript 来开发的原因。


png-city-map-this-program-is-a-bit-more-complicated-than-the-fly-through-cities-a-bit-under-300-lines-of-code-but-it-s-still-quite-simple-this-speaks-to-the-power-of-408.png

业务复杂,数据模型复杂业务逻辑复杂

钉钉有上百 rpc 接口,这些接口的地址、参数和返回值都需要各个平台的前端进行了解,这些接口可能被不同语言进行调用,所以需要一种通用描述语言来讲接口对应不同的语言。为了满足不同业务在钉钉有几十种的消息推送。


avengers-age-of-ultron.jpeg

所以在前端有大量数据结构,javascript 作为动态语言,没有数据类型的提示和检查,对应钉钉这样复杂大型的应用 javascript 可能显得力不从心,但是 javascript 对于跨平台又是最好选择,所以钉钉引入了 typescript 对类型进行控制。

钉钉的解决方法使用 typescript 开发前端
通过定义接口描述 idl 来支持多平台的应用开发

实时性要求高,对异步要求也是很高的

前端采用 rxjs 进行响应式编程。Rx 在响应式编程中已经占据不可动摇位置,我在 Android 编程中就用大 RxAndroid。不过看他是不是可以挡得住 Kotlin 的 corutine 的冲击


iron-man-vs-thanos.jpg

下面就是一个示例,这是示例是由钉钉开发者大会上演示示例

export const getUserById(){

}

user = {

    "uid":"1",
    "nickName":"zidea",
    "sex":"M",
    "bio":"",
    "isActive":true,
    "org":{
        "mainOrgId":"",
        "orgList":[
            {
            }
        ]
    }
}

这么复杂数据类型我们需要经验和反复才能记下来,而且有的数据类型是可选的例如这里 org 字段内容如果个人注册那么他用户信息中就没有这个字段。钉钉又不能把这些潜在的个人用户挡在门外,所以这个 org 字段是可选。
我们可以通过 typescript 以接口形式定数据类型和限制数据类型,这样使用这个数据类型时候就会在编译中检查,从而避免一些不必要的麻烦。


export enum SEX{
    Male = 'M',
    Female = 'F'
}

export interface IDepartment {
    departId:string,
    departName:string
}

export interface IOrgItem {
    orgId:string,
    orgName:string,
    departmentList:IDepartment[]
}

export interface IOrg{
    mainOrgId:string;
    orgList:IOrgItem[]
}

export interface IUSer{
    uid:number;
    nickName:string;
    sex:SEX;
    avatar:string;
    bio:string;
    isActive:boolean;
    org?:IOrg;
}

export const getUserById = (uid:number):Promise<IUSer> =>{
    return fetch('/users?id=' + uid).then(
        (reponse) => reponse as IUSer
    )
}

而且大家注意到了 org? 表示 org 是可选。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容