精华内容
下载资源
问答
  • 避免出现新增了联合类型没有对应的实现,目的就是写出类型绝对安全的...没有类型是never的子类型或能赋值给nevernever类型本身除外)。 在有明确never返回类型注解的函数中,所有return语句(如果有的话)必须有neve

    避免出现新增了联合类型没有对应的实现,目的就是写出类型绝对安全的代码。

    TypeScript 2.0引入了一个新原始类型never。never类型表示值的类型从不出现。具体而言,never是永不返回函数的返回类型,也是变量在类型保护中永不为true的类型。
    never类型具有以下特征:

    • never是所有类型的子类型并且可以赋值给所有类型。
    • 没有类型是never的子类型或能赋值给never(never类型本身除外)。
    • 在有明确never返回类型注解的函数中,所有return语句(如果有的话)必须有never类型的表达式并且函数的终点必须是不可执行的。

    比较直观的代码举例:

    interface Foo {
      type: 'foo'
    }
    interface Bar {
      type: 'bar'
    }
    type All = Foo | Bar
    

    在 switch 当中判断 type,TS 是可以收窄类型的 (discriminated union):

    function handleValue(val: All) {
      switch (val.type) {
        case 'foo':
          // 这里 val 被收窄为 Foo
          break
        case 'bar':
          // val 在这里是 Bar
          break
        default:
          // val 在这里是 never
          const exhaustiveCheck: never = val
          break
      }
    }
    

    注意在 default 里面我们把被收窄为 never 的 val 赋值给一个显式声明为 never 的变量。如果一切逻辑正确,那么这里应该能够编译通过。

    但是假如后来有一天你的同事改了 All 的类型:

    type All = Foo | Bar | Baz

    然而他忘记了在 handleValue 里面加上针对 Baz 的处理逻辑,这个时候在 default branch 里面 val 会被收窄为 Baz,导致无法赋值给 never,产生一个编译错误。所以通过这个办法,你可以确保 handleValue 总是穷尽 (exhaust) 了所有 All 的可能类型。

    参考:知乎大佬们的回答

    展开全文
  • <p>Returns never in TS3.9.x, works in 3.8.x. <p>Looks like dark magic is not working anymore =(. I would really appreciate help with this one. <p>Or maybe it will make more sense to open ticket in...
  • “字数:1737字阅读: 3 分钟大家好,今天和大家聊下让我曾经迷惑的两个TS类型:unknown 和 never,不知道大家有没有对其用法有所迷惑呢,好记性比不过烂笔头,为了让我不...

    字数:1737字   阅读: 3 分钟

    大家好,今天和大家聊下让我曾经迷惑的两个TS类型:unknown 和 never,不知道大家有没有对其用法有所迷惑呢,好记性比不过烂笔头,为了让我不再迷惑,还是通过文字的形式整理下加深下印象比较靠谱,希望今天的分享能给大家解惑。

    一、unknown 类型

    unknown 类型是 TS3 新增的类型,这个类型与 any 类型类似,可以设置任何的类型值,随后可以更改类型。因此,我们可以将变量先设置为字符串类型,然后再将其设置为数字类型,如果事先不检查类型,使用any类型,调用了不存在的方法,编译时不会报错,代码运行时才会发现错误。但是使用unknown 类型不一样,如果不进行类型判断,执行相关操作编译器就会报错。文字说了这么多,还是 上代码,更容易理解些。

    1、关于 Any 的问题

    首先我们创建一个 any.ts 的文件,代码如下:

    let val: any = 22;
    val = "string value";
    val = new Array();
    val.push(33);
    console.log(val);
    

    运行编译后的代码,并不会报错,也是按照我们的预期输出:[33]

    由于是 any 类型,我们可以随意更改类型,当变成数组类型时,我们调用push方法进行内容操作,看似没啥问题,如果我们开发人员,由于疏忽,打错了一个不存在的方法,ts代码能正常编译,帮我们发现问题吗?

    let val: any = 22;
    val = "string value";
    val = new Array();
    val.doesnotexist(33);
    console.log(val);
    

    当运行 tsc any 命令后,你会发现编译器能顺利编译,当我们运行 node any,编译后的代码能正常执行吗?答案是显而易见的,会报异常,你会在控制台发现以下错误:

    val.doesnotexist(33);
        ^
    
    TypeError: val.doesnotexist is not a function
    

    上述的错误,大家可能不会犯,但是项目大时,参与的人多时,就很难避免这样类似的问题,因此unknown 类型出现了。

    2、一段 unknown 类型的代码

    接下来我们来看看它是怎么解决类似的问题,我们还是从一段简单的代码开始,如下段代码所示:

    let val: unknown = 22;
    val = "string value";
    val = new Array();
    val.push(33);
    console.log(val);
    

    当你编译此代码时,你会立马收到如下报错:

    Property 'push' does not exist on type 'unknown'.
    

    是不是很奇怪,虽然我们将其类型更改为数组类型,但是编译器不认识,它认为unknown类型,这个类型没有push方法,当然会报错,除非先判断类型,如果是相关类型且正确执行相关方法,编译器则会顺利通过,如下段代码所示

    let val: unknown = 22;
    val = "string value";
    val = new Array();
    if (val instanceof Array) {
        val.push(33);
    }
    console.log(val);
    

    虽然有些麻烦,但是相比 any 类型说,更加安全,在代码编译期间,就能帮我们发现由于类型造成的问题,因此在大多的场景,建议使用 unknown 类型替代 any。

    二、never 类型

    这个类型看起来有些奇怪,乍一看,看起来和void相似,但是其完全不一样。从字面意思上来说,表示一个从来不会有返回值的函数(例:while(true) {}),一个总是会抛出错误的函数(function foo() { throw new Error('Not Implemented') })。那么问题来了,它和 void 类型啥区别,void 表示没有任何类型,函数没有返回值时(可以返回,但是没值),我们可以设置为void 类型;never这不一样,一个函数根本就没返回(或者总是出错,永远不会有返回值)。看文字有些费劲,我们还是来看一段简单的代码来理解下吧,如下所示:

    function alwaysThrows(): never { 
        throw "this will always throw"; 
        return -1; 
    }
    

    当我们编译上述代码时,编译器就会报错,如下所示:

    Type 'number' is not assignable to type 'never'.
    

    编译器已经很明确的告诉了我们 never 类型不应该返回任何值(或抛异常)。那么问题来了,这个类型有啥用呢?我们还是举个例子来理解下吧,比如你有个 enum 枚举类型,代码如下所示:

    enum TestNeverEnum { 
        FIRST, 
        SECOND 
    }
    

    在 switch 当中判断 type,TS 是可以收窄类型的 (discriminated union):

    enum TestNeverEnum {
        FIRST,
        SECOND
    }
    
    function getEnumValue(value: TestNeverEnum): string { 
        switch (value) { 
            // 这里 value 被收窄为 TestNeverEnum.FIRST
            case TestNeverEnum.FIRST: return "First case"; 
            // 这里 value 被收窄为 TestNeverEnum.SECOND
            case TestNeverEnum.SECOND: return "Second case"; 
            // returnValue 是 never 类型
            default: const returnValue: never = value; 
        } 
    }
    

    注意在 default 里面我们把被收窄为 never 的 returnValue 赋值给一个显式声明为 never 的变量。如果一切逻辑正确,那么这里应该能够编译通过。但是假如有一天你的同事增加了TestNeverEnum 枚举类型:

    enum TestNeverEnum {
        FIRST,
        SECOND,
        THIRD
    }
    

    然而他忘记了在 getEnumValue 里面加上针对 THIRD 的处理逻辑,这个时候在 default branch 里面 returnValue 会被收窄为 TestNeverEnum.THIRD,导致无法赋值给 never(因为有值返回),产生一个编译错误。编译器会产生如下的错误:

    Type 'TestNeverEnum' is not assignable to type 'never'.
    

    所以通过这个办法,你可以确保 getEnumValue 方法里总是穷尽 (TestNeverEnum) 了所有 All 的可能类型,目的就是写出类型绝对安全的代码。

    三、结束语

    今天的内容就到这里,这两个类型你品明白了吗?虽然内容不多,但是需要细品 ,才能理解其应用场景和用好他们,感谢的阅读。

    展开全文
  • 使用了typescript 简称ts 声明的变量未使用 出现波浪线提示“‘props’ is declared but its value is never read”,是noUnusedParameters:true导致的 可以修改tsconfig.json文件的noUnusedParameters为false即可...

    使用了typescript 简称ts
    声明的变量未使用 出现波浪线提示“‘props’ is declared but its value is never read”,是noUnusedParameters:true导致的
    在这里插入图片描述
    在这里插入图片描述
    可以修改tsconfig.json文件的noUnusedParameters为false即可
    noUnusedParameters:false

    展开全文
  • <div><p>This could be an issue with the tsc version bundled with grunt-ts I suppose. System used is a (very slow) laptop with windows 8.1. grunt-ts version is <code>1.10.0</code> and tsc version is ...
  • 当使用ts语法导入第三方库时,比如koa模块,这时会发现出现这个错误。这个错误因为没有默认导出。 问题原因 一般我们使用ts导入其他模块时都会有一个声明文件。不明白可以看我另外一篇博客,我们进入声明文件中可以...

    问题重现

    当使用ts语法导入第三方库时,比如koa模块,这时会发现出现这个错误。这个错误因为没有默认导出。
    在这里插入图片描述

    问题原因

    一般我们使用ts导入其他模块时都会有一个声明文件。不明白可以看我另外一篇 博客,我们进入声明文件中可以发现模块是通过export =的方式导出的。
    在这里插入图片描述
    于是我们去TS官网中的模块可以发现:当使用export = 和 import = require()时

    • CommonJS和AMD的环境里都有一个exports变量,这个变量包含了一个模块的所有导出内容。
    • CommonJS和AMD的exports都可以被赋值为一个对象, 这种情况下其作用就类似于 es6 语法里的默认导出,即 export default语法了。虽然作用相似,但是 export default 语法并不能兼容CommonJS和AMD的exports。
    • 为了支持CommonJS和AMD的exports, TypeScript提供了export =语法。
    • export =语法定义一个模块的导出对象。 这里的对象一词指的是类,接口,命名空间,函数或枚举。
    • 若使用export =导出一个模块,则必须使用TypeScript的特定语法import module = require(“module”)来导入此模块。

    可以发现,ts为了兼容CommonJS和AMD的exports。所以这里定义了一种方法来解决这种问题使用export= 的方式导出的模块必须使用import module = require(“module”)这种方式导入。

    在这里插入图片描述
    这里也可以使用另外一种方式解决这个问题:

    import * as koa from ‘koa’

    但是这种方式导入和上面是有一些区别的。

    展开全文
  • suggest that the <code>fields</code> property cannot be <code>undefined</code>: https://github.com/contentful/contentful.js/blob/559733a47b2dcf8918f46c15f7d10ae366f09e49/index.d.ts#L82</p> <p>That isn...
  • <div><p>PHP will never be able to satisfy this float 1562189704.014800 <p>Sending Slack a string of "1562189704.014800" works perfectly fine. <p>...
  • </code> and <code>ts</code> keeps saying that is <code>of type never</code>. <p><code>error TS2322: Type 'Date' is not assignable to type 'never</code></p> <p>I've tried about ...
  • 修改tsconfig.json 中的配置 为false "noUnusedLocals": false, // 有未使用的变量时,抛出错误
  • <div><p>If you use <code>tw...<p>I could disable this warning in TS, or <code>// -ignore, but is there a better way of dealing with it?</p><p>该提问来源于开源项目:ben-rogerson/twin.macro</p></div>
  • <div><p>https://codesandbox.io/s/objective-sunset-3rpyp</p> <p>The primitives have their own type so we cannot style any of our primitives using this API atm. ...modulz/stitches</p></div>
  • TypeScript的Tslint又报错了,这回是变量未重新...TSLint: Identifier 'errMsg' is never reassigned; use 'const' instead of 'let'. (prefer-const) TSLint:标识符'errMsg'永远不会被重新分配;使用'const'而不是'l
  • error: TS1371 [ERROR]: This import is never used as a value and must use 'import type' because the 'importsNotUsedAsValues' is set to 'error'. import { BufReader, BufWriter } ...
  • &nbsp;&nbsp;&nbsp;&nbsp;最近小咸儿在学习angular的时候,又遇到了一个新鲜的错误,看起来很开心啊!...[tslint]报错:[tslint] Identifier ‘loggedIn’ is never reassigned; use...
  • 现象: app 启动了,然后挂了,提示如下信息: info: Error: ... never started. Current: com.vmware.socialcast/.account.SocialcastAccountAuthenticatorActivity 原因: app yn
  • vue + ts tslint.json配置

    2020-08-26 09:02:34
    "tslint:recommended" ], "linterOptions": { "exclude": [ "node_modules/**" ] }, "rules": { // 禁止自动检测末尾行必须使用逗号,always总是检测,never从不检测,ignore忽略检测 "trailing-comma": ...
  • ts数据类型

    2021-03-03 10:22:13
    never类型(其他类型) ts定义数据的规范: 提示:ts在定义数据的时候必须指定数据类型(整型和浮点型都归为number类型) 例如: 1、 var flag:boolean=true; 2、 var aa:number=123; 3、 数组类型定义有两种方式: ...
  • Ts Worker Failing

    2020-11-26 05:19:16
    <div><p>Since not so long the TS worker fails after several seconds after opening Atom and never starts again ;( This is message in the log: <pre><code> /Users/tomi/.atom/packages/typescript-modules-...
  • Add tslint

    2020-12-09 10:30:15
    never-prefix".</li></ul> <p>Even Microsoft don't use this rule in their projects (I checked few). There are some predefined interfaces like <code>Window</code> don't start with I. (and we ...
  • Ignore TS checks

    2020-12-27 12:08:15
    <div><p>Since the introduction of generic type tagged unions, I have an error when compiling the TS because of the <a href="https://www.typescriptlang.org/docs/handbook/compiler-options.html"><code>...
  • BOT never starts

    2020-12-31 21:17:37
    [07-Nov-2016 16:33:21 UTC] PHP Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/bm8clan/public_html/ts3/webinterface/core.php:1) in /home/bm...
  • ve published the extension a number of times before and have never had issue with this in the past, I'm not really sure what's changed. <p>Any information would be greatly appreciated! <p>...
  • d.ts compilation errors

    2020-12-08 18:41:00
    ERROR in /Users/josh/DEV/censinet/client/node_modules/typesafe-actions/dist/is-of-type.d.ts(2,25): TS2323: Cannot redeclare exported variable 'isOfType'. ERROR in /Users/josh/DEV/censinet/...
  • <p>This pr removes the usage of Upgraded Services from App.ts and adds lint check. <ol><li>This PR fixes or fixes part of #[fill_in_number_here].</li><li>This PR does the following: [Explain here ...
  • TS 的语法

    2020-11-10 13:36:02
    typeScript 中为了使编写大代码更规范,更利于维护,增加了类型效验,在ts中为我们提供了以下类型 布尔类型:boolean 数字类型:number 字符串类型:string 数组类型:array 元组类型:tuple 枚举类型:enum 任意...
  • TS学习总结

    2020-12-09 22:07:27
    (1)编译开发TS可以使用 (2)数据类型 数据类型主要作用是:方便数据维护和数据校验; 布尔类型 boolean 数字类型 number 字符串类型 string 数组类型 array 元组类型 tuple 枚举类型 enum 任意类型 any null 和 ...
  • TS变量初始

    2021-03-11 17:36:13
    变量类型 number 表示数字类型的值 boolean 表示布尔类型的值 ...在使用any的时候需要注意,在赋值的时候可以影响被赋值的变量,不会触发ts的错误评判。 Unknown,其实是一种类型安全的any,不能直接赋值给其
  • <p>After compiling with <code>tsc</code> the resulting <code>.d.ts</code> files end up having broken declarations. At least the <code>... 4 more ...</code> part of the following would seem to be ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,311
精华内容 924
关键字:

neverts