typescript - 有人可以向我解释一下 'as never' 在这段代码中做了什么吗?

标签 typescript

就像标题所说,我对这段代码中“永远”的含义感到困惑。我读到它应该意味着永远不会发生或排除其他类型的东西,但我不太明白为什么它会像下面的代码片段一样使用。

import { View, Button, Text, StyleSheet, FlatList, TouchableOpacity, Image } from 'react-native'
import React from 'react'
import { useNavigation } from '@react-navigation/native'

const data = [
  {
    id: 1,
    title: 'Google Search',
    screen: 'MapScreen',
  },
  {
    id: 2,
    title: 'I\'m Feeling Lucky',
    screen: 'MapScreen',
  }
]

const NavOptions = (props: NavProps) => {
  const navigation = useNavigation();
  return (
    <FlatList
      data={data}
      keyExtractor={(item) => item.id}
      horizontal
      renderItem={({ item }) => (
        <View style={styles.container}>
          <TouchableOpacity
            onPress={() => props.term && navigation.navigate(item.screen as never, {
              term: props.term,
            } as never)}
            style={styles.button}>
            <Text style={styles.text}>{item.title}</Text>
          </TouchableOpacity>
        </View>
      )}
    />
  )
}

const styles = StyleSheet.create({
  container: {
    padding: 10,
  },
  button: {
    backgroundColor: "#f8f9fa",
    padding: 10,
  },
  text: {
    color: "black",
    textAlign: "center",
  },
});

type NavProps = {
  term: string;
}

export default NavOptions

最佳答案

代码根本就是错误的。

您对never的理解大致正确:它是一种没有有效值的类型,并且通常作为不兼容类型的交集出现;它代表无法访问的代码、逻辑上不可能的情况以及无法完全计算的表达式。一个典型的例子是抛出异常而不是正常返回的函数:

function raiseRangeErr(e: string): never {
    throw new RangeError(e);
}

function div(a: number, b: number): number {
    return b !== 0 ? a / b : raiseRangeErr("division by zero");
}

never 具有独特的属性,即该类型的表达式可以分配给任何其他类型。这是可行的,因为 never 没有值,特别是它没有可能无法成为目标类型成员的值。

编写该代码的程序员可能想懒惰地利用此属性来抑制有关不可分配类型的错误。从类型论的角度来看,这是不正确的:范围内 never 的代码应该是不可访问的,但问题中的代码显然是不可访问的。

无论如何,最好避免类型断言;如果您可以简单地删除这些断言并且不会出现任何错误,那么就这样做。如果您毕竟必须使用类型断言,请使用特定于当前情况的类型。在最坏的情况下,请使用 as anyas never 远程可接受的唯一情况是调用一个您碰巧知道永远不会返回的函数,但您缺少捕获该函数的类型定义。举一个人为的例子:

function raiseRangeErr(e: string): unknown {
    throw new RangeError(e);
}

function div(a: number, b: number): number {
    return b !== 0 ? a / b : raiseRangeErr("division by zero") as never;
}

即使如此,最好还是更新您的类型定义。

关于typescript - 有人可以向我解释一下 'as never' 在这段代码中做了什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72001800/

相关文章:

javascript - typescript 2 : Import statement generates TS2532: "Object is possibly ' undefined'.“

node.js - 将 typedoc 部署到 gh-pages

TypeScript – TypeError : Alice_1. Alice 不是构造函数

javascript - 将变量声明为对象值时出现 TSlint 错误 "Expected property shorthand in object literal..."

javascript - 在 ReactJs 中创建动态 svg 图标组件

Angular 2 测试用例显示没有 NgControl 的提供者

reactjs - 类型中缺少不应手动传递给子组件的属性

typescript - 在 Typescript 中标记为 protected 继承属性的 Angular 5 生产构建错误 - 'property does not exist on type' *Component

pluck 的 TypeScript 定义

Typescript - 具有已知键的键/值类型