您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    如何编写强健的 TypeScript 库?
    时间:2020-10-30 21:03 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    当你用 TypeScript 编写库时,你通常不知道这个库最终将如何被运用。即使你 正告潜在用户,你编写这个库只是针对 TypeScript 用户,你还是能够会在某个时辰拥有 JavaScript 用户——或许是由于他们不顾你的正告而运用这个库,或许是他们由于传递性依赖而运用这个库。这有一个十分重要的结果:你必须将这个库设计成任何言语的开发者都可以运用!

    如何编写强健的 TypeScript 库?

    其主要部分是函数定义和函数体。假设你针对一个纯 TypeScript 读者编写,那么你只需定义函数类型并信任编译器处置其它事情。假设你针对一个纯 JavaScrpit 读者编写,那么你需求记载那些类型,但在函数中将实践的类型设为unknown并反省调用方传递的内容。

    例如,给定如下代码

    interface Person { 

     

    age: number; 

     

    name?: string; 

     

     

    function describe(person: Person): string { 

     

    let name = person.name ?? 'someone'

     

    return `${name} is ${person.age} years old!`; 

     

    一个 JS 用户能够用任何东西来调用describe函数。

    正确写法:

    describe({ name: "chris" }) 

    灾难性的错误写法: 

    describe("potato"); 

    最常见的 JS 错误:

    describe(undefined); 

    你的库的 JS 用户并不是成心这么做的。恰恰相反,在任何足够大的系统中,很容易将错误的参数传递给系统中的某个函数。这通常是一个很难避免的错误,比如在一个点上做了修正,许多其它中央需求更新,但漏掉了一个点。成心的 JS 开发者会把坏数据发送到你设计精巧的 TS API 中。

    假设你针对一个纯 TypeScript 读者编写,那么你只需定义函数类型并信任编译器处置其它事情

    我成心不提 TypeScript 编译十分严厉,从一个与 JavaScript 没有区别的级别到简直任何人能够想到的严厉级别。这意味着,即使是 TypeScript 调用者也应该像 JavaScript 调用者一样被看待:众所周知,他们四处乱扔any,疏忽了理想上能够是null或undefined的中央。前往下面的示例代码:

    interface Person { 

     

    age: number; 

     

    name?: string; 

     

     

    function describe(person: Person): string { 

     

    let name = person.name ?? 'someone'

     

    return `${name} is ${person.age} years old!`; 

     

    在没有启用严厉标识的状况下,TypeScript 用户可以如下调用describe:

    function cueTheSobbing(data: any) { 

     

    describe(data); 

     

     

    cueTheSobbing({ breakfastOf: ["eggs""waffles"] }); 

    或许这样:

    describe(null); 

    或许这样:

    describe({ age: null }) 

    也就是说:JS 调用者大部分会出错的方式,TS 调用者在封锁严厉性设置的状况下也会出错。这意味着成心的 TypeScript 用户也会用坏数据调用你的库。而且由于他们依赖其它库,这很能够不是他们的错误,由于这种成绩能够发作在依赖图中的任何中央。

    因此,假设成绩是我们不能信任数据,那么我们应该怎样做?一个选项是使函数的一切参数实践为unknown,并用 JSDoc 指定它该如何。但是,那样会使我们失掉少量 TS 提供的才能。当与函数交互时,我们即使在外部也不会失掉补全或类型错误,更不用说我们的库的用户。但是正如我们刚刚看到的,我们也不能依赖类型定义来提供函数外部的安全性。不过,我们可以将这几种办法结合起来:指定类型定义,并将传入的数据视为实践上的unknown。这确实带来了运转时开支——我们稍后将围绕这个权衡停止详细讨论。如今,我们可以先看看如何反省类型。

    首先,我们会像实践上会从调用者失掉真正未知的数据来编写我们的代码,由于我们曾经确定了这正是我们能够失掉的。一旦我们完成了对unknown数据的校验,我们就可以将它交流为Person,而且一切东西都应该继续任务,但是如今我们可以保证它对任何抛给它的数据都可以任务。

    function describe(person: unknown): string { 

     

    let name = person.name ?? 'someone'

     

    return `${name} is ${person.age} years old`; 

     

    (责任编辑:admin)