为啥在数组上使用 ?: 运算符时打字稿不需要`undefined`? [复制]

Posted

技术标签:

【中文标题】为啥在数组上使用 ?: 运算符时打字稿不需要`undefined`? [复制]【英文标题】:Why does typescript not require `undefined` when using the ?: operator on an array? [duplicate]为什么在数组上使用 ?: 运算符时打字稿不需要`undefined`? [复制] 【发布时间】:2022-01-24 00:10:57 【问题描述】:
type Artifact = 
    a:string


const items : Artifact[] = [];

// this is a syntax error
let z?: Artifact;

// this is an error because you cannot assign undefined.
const b : Artifact = undefined;

// this worked!? but I don't think it should because the 
// value could be undefined
const c : Artifact = items?.[0];

// These work as expected.
const a : Artifact|undefined = undefined;
const d : Artifact|undefined = items?.[0];

Playground

【问题讨论】:

?: 运算符是什么?您的问题是“为什么编译器认为读取的数组永远不会产生undefined?我假设是这样;请参阅this question 及其答案。如果我的假设是错误的并且您要问其他问题,请edit 区分这是另一个问题。祝你好运! 【参考方案1】:

项目在您的代码中不断定义,所以“?”被忽略

我扩展了您的示例以显示所有变体 Playground Link

const items: Artifact[] | undefined = [];
const undefinedItems: Artifact[] | undefined = undefined;
function getItems(): Artifact[] | undefined 
    return [];

const c0 : Artifact = items[0];
const c1 : Artifact = items?.[0];
const c2 : Artifact = undefinedItems?.[0];
//    ^ Type 'undefined' is not assignable to type 'Artifact'
const c3 : Artifact = getItems()[0];
//                    ^ Object is possibly 'undefined'.
const c4 : Artifact = getItems()?.[0];
//    ^ Type 'Artifact | undefined' is not assignable to type 'Artifact'

【讨论】:

以上是关于为啥在数组上使用 ?: 运算符时打字稿不需要`undefined`? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

打字稿不正确的分配/映射到强类型对象[关闭]

打字稿不推断通用对象的值

在 ionic2 中添加自定义用户定义的 Cordova 插件,但打字稿不起作用

预中间件中的猫鼬打字稿不存在

为啥 xState 不能与 react redux 一起使用?

如何在打字稿元组中使用扩展运算符?