首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在react typescript中,类型'string‘不能赋值给类型'never’,类型'unknown‘也不能赋值给类型'never’错误

这个错误通常发生在 TypeScript 的严格模式下,当 TypeScript 编译器无法确定某个值的类型时,它会将其推断为 never 类型。never 类型表示的是那些永不存在的值的类型,例如一个函数永远不会返回的情况。

基础概念

  • TypeScript:一种由微软开发的自由和开源的编程语言,它是 JavaScript 的严格语法超集,为该语言添加了可选的静态类型和基于类的面向对象编程。
  • 类型系统:TypeScript 的类型系统允许开发者为变量、函数参数和返回值指定类型,这有助于在编译阶段捕捉错误。
  • never 类型never 是 TypeScript 中的一个特殊类型,它表示那些永不存在的值的类型。

问题原因

当 TypeScript 编译器遇到一个逻辑上不可能到达的分支时,它会将该分支的返回类型推断为 never。如果尝试将一个具体的类型(如 stringunknown)赋值给 never 类型,就会发生错误。

解决方法

  1. 检查逻辑:确保你的代码逻辑正确,没有不可能到达的分支。
  2. 类型断言:如果你确定某个值不会是 never 类型,可以使用类型断言来告诉编译器。
  3. 类型保护:使用类型保护函数或类型谓词来缩小变量的类型范围。

示例代码

假设你有以下代码:

代码语言:txt
复制
function getLength(value: string | number): number {
    if (typeof value === "string") {
        return value.length;
    } else if (typeof value === "number") {
        return value;
    }
    // 这里 TypeScript 会推断 return 语句的类型为 never
}

在这个例子中,如果 value 既不是 string 也不是 number,TypeScript 会认为这里的返回类型是 never。为了解决这个问题,你可以添加一个默认返回值:

代码语言:txt
复制
function getLength(value: string | number): number {
    if (typeof value === "string") {
        return value.length;
    } else if (typeof value === "number") {
        return value;
    }
    // 添加默认返回值
    throw new Error("Invalid input");
}

或者使用类型断言:

代码语言:txt
复制
function getLength(value: string | number): number {
    if (typeof value === "string") {
        return value.length;
    } else if (typeof value === "number") {
        return value;
    }
    // 使用类型断言
    return (value as never).length; // 不推荐,仅作为示例
}

参考链接

通过以上方法,你可以解决 TypeScript 中 stringunknown 类型不能赋值给 never 类型的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 4000字讲清 《深入理解TypeScript》一书 【基础篇】

    // 类型安全 Card = 'not a member of card suit'; // Error: string 不能赋值给 `CardSuit` 类型 enum Tristate {...event as HTMLElement; // Error: 'Event' 和 'HTMLElement' 中的任何一个都不能赋值给另外一个 } 如果你仍然想使用那个类型,你可以使用双重断言。...('Not Implemented') },foo 的返回类型是 never) 你也可以将它用做类型注解: let foo: never; // ok 但是,never 类型仅能被赋值给另外一个 never...: let foo: never = 123; // Error: number 类型不能赋值给 never 类型 // ok, 做为函数返回类型的 never let bar: never = ((...为 false 时),但是 never 不能赋值给其他任何类型,除了 never TypeScript 索引签名 JavaScript 在一个对象类型的索引签名上会隐式调用 toString 方法

    1.9K30

    【TypeScript】never 和 unknown 的优雅之道

    1、前言  TypeScript 在版本 2.0 和 3.0 分别引入了 “never” 和 “unknown” 两个基本类型,在引入这两个类型之后,TypeScript 的类型系统得到了极大的完善。...2、TypeScript 中的 top type、bottom type 在类型系统设计中,有两种特别的类型: Top type:被称为通用父类型,也就是能够包含所有值的类型。...按照类型系统的解释,在 TypeScript 3.0 中,有两个 top type(any 和 unknown) 和一个 bottom type(never)。...,导致无法赋值给 never,产生一个编译错误。...通过深入了解 never 和 unknown 在 TypeScript 类型系统中的使用和地位,可以学习到不少类型系统设计和集合论的知识,在实际开发中合理 narrow 类型,组织起可靠安全的代码。

    1.3K20

    TypeScript一些知识点

    TypeScript中有两种顶端类型: any unknown any 类型允许执行任意操作而不会产生编译错误(但运行时候也可能出现错误),通常用于跳过类型检查: const a: any = 0; a.length...与 any 类型任何其他类型都可以赋值给 unknown ,但是unknown类型的值只能赋值给 unkonwn 和 any,而且 unknown 不允许执行绝大多数的操作: let a: unknown...= 1; // Error never没有值 let d: never = undefined; // Error never没有值 显示设置undefined也不行 注:虽然 never 可以赋值给任何类型...由于元组类型是数组的子类型所以元组类型可以赋值给数组类型,前提是元组中的每一项都符合数组的每一项类型;数组类型是不能赋值给元组类型的。...对于多条函数重载来说,每个函数重载中的函数名和函数实现中的函数名必须一致。同时函数重载语句与其他函数重载语句或函数实现语句之间不能出现其他语句,否则将产生编译错误。函数重载语句在函数编译后将会删除。

    11210

    TypeScript never 类型

    一、底部类型 在类型理论(数学逻辑中的一种理论)中,底部类型是没有值的类型。也称为零或空类型,有时用 falsum(⊥)表示。...在定义变量时,可以设置变量的类型为 never 类型: let foo: never; // 定义never类型的变量 never 类型是任何类型的子类型,也可以赋值给任何类型: let bar: string...即使 any 也不可以赋值给 never。...let baz: never = 123; // 赋值失败,number类型不能赋值给never类型的变量 // 定义never类型变量,接收返回值类型为never类型的函数返回值 let bar:...方法中的控制流程,这时候 else 分支的 foo 类型会被收窄为 boolean 类型,导致无法赋值给 never 类型,这时就会产生一个编译错误。

    4.2K10

    TypeScript不学?你养我啊

    let a:number; 当我们给a赋值字符串时,就会提示错误。 并且我们再执行编译的时候,也会报错。但是即使报错也会将ts成功编译成相应的js文件。...let c:boolean = false 如果我们在声明完直接赋值,并且没有定义类型。如下,此时给bool赋值为true,然后又赋值为123。此时也会报错的。因为Ts会自动判断类型。...any可以霍霍别人儿 let no_use:any let str:string str = no_use 而 把unknown赋值给别的类型 就会报错。...let str:string let e:unknown e ='sss' str = e unknown类型实际上是一个类型安全的any,unknown类型的变量不能赋值给其他变量 unknown类型赋值给...在vsCode编辑器中null返回值不能使用void类型,对于null类型的可以如下面的下面的写法。 而在webstorm中就是可以的。

    89620

    TypeScript类型声明

    ;console.log(booleanValue)//trueany在使用过程中就像一个潘多拉魔盒,即使使用了断言,也丧失了在静态类型检查阶段发现错误的可能性。...类型,any类型可以赋值给任意类型unknown,never都不允许执行变量的方法以及访问内部属性在unknown没有被断言或细化到一个确切类型之前,unknown不可以赋值给其它类型,除了它自己和any...类型的变量let testValue1: unknown = unknownValue;//赋值给any类型的变量let testValue2: any = unknownValue;错误示范://赋值给...即使any类型也不可以赋值给never类型。返回类型为never的函数中,其终点必须是不可执行的,例如函数过程中抛出了错误或者存在死循环。...变量也可以声明为never类型,但其不能被赋值设置变量类型为never,表示永远不能执行完或者永远Error,具体示例如下:函数中出现了死循环,永远不能执行完,因此其函数类型为:() => neverfunction

    37330

    类型即正义:TypeScript 从入门到实践(一)

    在现代 JavaScript 世界中,已经有很多大型库在使用 TypeScript 重构,包括前端三大框架:React、Vue、Angular,还有知名的组件库 antd,material,在很多公司内部的大型业务应用也在用...变量的类型就被静态化了,在初始化时,就不能再赋值其他的类型给这个 tutureSlogan 变量了,比如我们将 number 类型的字面量赋值给 tutureSlogan ,就会报错: const...提示有些细心的同学可能对上面的报错信息有点不能理解,对于报错信息的后半段类型 string 可能理解,因为我们给 tutureSlogan 限制了 string 类型,但是对于我们的赋值 5201314...never / 函数类型定义与实战 never 的字面意思是 “永不”,在 TS 中代表不存在的值类型,一般用于给函数进行类型声明,函数绝不会有返回值的时候使用,比如函数内抛出错误,我们首先看个例子将讲解一下如何给函数进行类型声明...,只是单纯的抛出错误,所以我们给返回值一个 never 类型。

    2.6K20

    《现代Typescript高级教程》类型

    它还增加了额外的类型,比如any、unknown、never、void等。 number 在TypeScript中,所有的数字都是浮点数。这些数字的类型是number。...在接下来的对话中,我们可以进一步讨论其他的TypeScript类型,比如枚举(enum)、null、undefined、never、void以及对象类型。...unknown类型的变量只能被赋值给any类型和unknown类型本身: let value: unknown; value = true; // OK value = 42;...你可以传递一个string类型或者number类型的值给display函数,而TypeScript编译器不会报错: display(1); // OK display("Hello"); // OK 你也可以将联合类型用于变量和属性...然后我们可以安全地将一个字符串或者数字赋值给variable。 联合类型在TypeScript中非常常用,因为它们可以帮助你编写更灵活的代码。

    24440

    Typescript 高级用法以及项目实战问题

    的作用就跟 any 高度类似了,你可以把它转化成任何类型,不同的地方是,在静态编译的时候,unknown 不能调用任何方法,而 any 可以。...如果入参是any,则会放弃检查直接成功,带来报错风险 } void 在 TS 中,void 和 undefined 功能高度类似,可以在逻辑上避免不小心使用了空指针导致的错误。...举一个 React 中的实际的例子。...; let o: any = {}; n = o; // Error: 不能把一个非never类型赋值给never类型,包括any 关于 never 的这个特性有一些很 hack 的用法和讨论,比如这个知乎下的尤雨溪的回答...Test: string 首选看 extends 后面的内容,{t: infer Test}可以看成是一个包含t属性的「类型定义」,这个t属性的 value 类型通过infer进行推断后会赋值给Test

    1.9K50

    【TypeScript】TS类型声明(四)

    = anyValue;console.log(booleanValue)//trueany在使用过程中就像一个潘多拉魔盒,即使使用了断言,也丧失了在静态类型检查阶段发现错误的可能性。...类型,any类型可以赋值给任意类型unknown,never 都不允许执行变量的方法以及访问内部属性在unknown没有被断言或细化到一个确切类型之前,unknown不可以赋值给其它类型,除了它自己和any...类型的变量let testValue1: unknown = unknownValue;//赋值给any类型的变量let testValue2: any = unknownValue;错误示范://赋值给...即使any类型也不可以赋值给never类型。返回类型为never的函数中,其终点必须是不可执行的,例如函数过程中抛出了错误或者存在死循环。...变量也可以声明为never类型,但其不能被赋值设置变量类型为never,表示永远不能执行完或者永远Error,具体示例如下:函数中出现了死循环,永远不能执行完,因此其函数类型为:() => neverfunction

    22010
    领券