我以为result等于number | never[].

type T1 = (number | undefined)[]

const myFunc = (arr: T1, index: number) => {
    const result = arr[index] === undefined ? [] : arr[index]
    return result // number | never[] | undefined
}

为什么会这样?

推荐答案

TypeScript使用流分析来缩小变量类型.

type T1 = (number | undefined)[]
const myFunc = (arr: T1, index: number) => {
    if (arr[index] === undefined) {
        return []; // never[]
    }
    //the type of `arr` is still considered T1
    let temp = arr[index]; //number | undefined 
    return temp;
}

实际上,我不确定arr的类型应该如何表示为if块之后的类型(除了这个特定的动态索引不是未定义的之外,您如何表示"未定义的数字数组").简单地回到T1还是有道理的.

您的代码使用三元运算符,但其作用类似于我上面的代码.

然而,当变量用于流控制语句中的直接比较时,TypeScript可以缩小result变量的类型:

type T1 = (number | undefined)[]
const myFunc = (arr: T1, index: number) => {
    const result = arr[index];
    if (result === undefined) {
        return []; // never[]
    }
    //the type of `result` is correctly determined as number, not undefined
    return result;
}

我认为arrresult(变量)的类型可能会被控制流缩小,但arr[index](一个表达式,而不仅仅是一个变量)将只从arrindex的类型中计算出来.

Typescript相关问答推荐

Typescript对每个属性具有约束的通用类型

使Typescribe强制所有对象具有相同的 struct ,从两个选项

输入元素是类型变体的对象数组的正确方法是什么?'

如何在TypeScrip中从字符串联合类型中省略%1值

如何编写一个类型脚本函数,将一个对象映射(转换)为另一个对象并推断返回类型?

TypeScrip-将<;A、B、C和>之一转换为联合A|B|C

如何将定义模型(在Vue 3.4中)用于输入以外的其他用途

为什么我在这个重载函数中需要`as any`?

如何过滤文字中的类对象联合类型?

跟踪深度路径时按条件提取嵌套类型

如何正确调用创建的类型?

作为函数参数的联合类型的键

可以';t使用t正确地索引对象;联合;索引类型

如何避免TS2322;类型any不可分配给类型never;使用索引访问时

从泛型对象数组构造映射类型

如何将 MUI 主题对象的自定义属性与情感样式组件中的自定义props 一起使用?

使用 fp-ts 时如何使用 TypeScript 序列化任务执行?

在 next.js 13.4 中为react-email-editor使用forwardRef和next/dynamic的正确方法

const nav: typechecking = useNavigation() 和 const nav = useNavigation() 之间有什么区别?

req.files = 未定义(Multer、Express、Typescript)