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