当前位置: 首页 > 知识库问答 >
问题:

TypeScript使用strictNullChecks进行的控制流分析不会缩小联合类型的范围

乜业
2023-03-14

我从书中得到了以下代码https://hamednourhani.gitbooks.io/typescript-book/

interface Square {
    kind: "square";
    size: number;
}

interface Rectangle {
    kind: "rectangle";
    width: number;
    height: number;
}

interface Circle {
    kind: "circle";
    radius: number;
}

type Shape = Square | Rectangle | Circle;

//Type of function: function area1(s: Square | Rectangle | Circle): number | undefined
function area1(s: Shape) {
    if (s.kind === "square") {
        return s.size * s.size;
    }
    else if (s.kind === "rectangle") {
        return s.width * s.height;
    }
    else if (s.kind === "circle") {
        return Math.PI * s.radius * s.radius;
    }
    else {
        //Type 'Square | Rectangle' is not assignable to type 'never'.
        const _exhaustiveCheck: never = s;
    }
}

//Function lacks ending return statement and return type does not include 'undefined'.
function area2(s: Shape): number {
    switch (s.kind) {
        case "square": return s.size * s.size;
        case "rectangle": return s.width * s.height;
        case "circle": return Math.PI * s.radius * s.radius;
        default: const _exhaustiveCheck: never = s; //Type of s is 'never'
    }
}

问题(--strictNullChecks):

  • 为什么表达式中的2个函数有不同的类型?我预计在这两种情况下,s都不会是
  • 为什么区域2函数希望返回类型为未定义的编号?在我看来,这里永远不会发生未定义的事情。我错了吗

暂时还没有答案

 类似资料:
  • 主要内容:TypeScript,JavaScript,TypeScript,JavaScript,联合类型数组,TypeScript,JavaScript联合类型(Union Types)可以通过管道(|)将变量设置多种类型,赋值时可以根据设置的类型来赋值。 注意:只能赋值指定的类型,如果赋值其它类型就会报错。 创建联合类型的语法格式如下: 实例 声明一个联合类型: TypeScript var val:string|number val = 12 console.log("数字为 "+ val

  • 本节介绍联合类型,它使用管道符 | 把多个类型连起来,表示它可能是这些类型中的其中一个。我们把 | 理解成 or,这样便于轻松记忆。 1. 慕课解释 联合类型与交叉类型很有关联,但是使用上却完全不同。区别在于:联合类型表示取值为多种中的一种类型,而交叉类型每次都是多个类型的合并类型。 语法为:类型一 | 类型二。 2. 简单示例 联合类型之间使用竖线 “|” 分隔: let currentMont

  • 我想避免“双向< code>@OneToMany”关联,因为: 它不能限制的大小 我需要分页。 为此,我使用了本教程,其中描述了“Just”关联,但不幸的是,它只给出了一行与此相关的代码: 所以,我有很多问题: > 我应该在哪里使用这条线? 我应该如何以及在哪里获得EntityManager?到底在实体中?是一个好的解决方案吗? 如何避免使用< code>EntityManager?我已经看了这个

  • 如果我有一个属性可能是字符串或布尔值,我该如何定义它: 我不想求助于: 我认为没有

  • 想实现value是string那么val就是string,value是string[]那么val就是string[]