Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 在分解空数组时,TS不会推断可能的未定义_Typescript_Typescript Typings_Destructuring_Type Safety - Fatal编程技术网

Typescript 在分解空数组时,TS不会推断可能的未定义

Typescript 在分解空数组时,TS不会推断可能的未定义,typescript,typescript-typings,destructuring,type-safety,Typescript,Typescript Typings,Destructuring,Type Safety,当查看推断的非结构化元素类型时,它将假定数组从不为空 const x: number[] = []; const [first] = x; // first inferred as number console.log(first); // undefined if (first !== undefined) { // ... } 例如,这导致了TSLint规则“strict type谓词”的一个有趣行为,它将if语句标记为始终为true,而实际上它不是 我是否遗漏了什么,这是

当查看推断的非结构化元素类型时,它将假定数组从不为空

const x: number[] = [];
const [first] = x; // first inferred as number

console.log(first); // undefined

if (first !== undefined) {
    // ...
}

例如,这导致了TSLint规则“strict type谓词”的一个有趣行为,它将if语句标记为始终为true,而实际上它不是

我是否遗漏了什么,这是正常行为?

TypeScript 4.1的更新 由于下列原因,
未定义
未包含在索引签名属性的域中,这仍然是预期行为。然而,由于这是一个经常被要求的特性,TypeScript团队(有点勉强?)已经让步并添加了。如果您启用了它(默认情况下它既没有启用,也没有包含在
--strict
编译器标志中,因此需要显式地执行),您将开始获得您可能想要的行为

请注意,这实际上与您自己添加
undefined
并不完全相同。索引访问将添加
未定义的

// --noUncheckedIndexedAccess is enabled

const x: number[] = [];
const [first] = x; // number | undefined

console.log(first); // undefined

if (first !== undefined) {
    first.toFixed(); // okay
}
但是,
for..of
循环和数组函数编程方法仍将起作用,就好像
未定义的
是不可能的(即:就好像稀疏数组不存在一样):

因此,您可能希望启用该标志。请记住,一些常见的数组/字典操作技术可能仍然“令人讨厌”,这就是为什么它不是
--strict
系列的一部分


原始答案 这是预期的行为。有关更多信息,请参阅。这个问题是一个请求,允许索引签名属性类型在其域中自动包含
未定义的
,虽然这个问题仍然存在,但很明显它不会实现。例如,见

它(见列表中的第3条)的类型系统是完美的或正确的(尽管像我这样的人当我们想得太多时会感到心痛;我之前开玩笑说要成立一个TypeScript不健全支持小组来帮助人们处理这个问题)。相反,在正确性和可用性之间有一个折衷

语言维护人员注意到,有很多实际代码索引到数组中,而无需到处检查可能的
未定义的
值,并且强制执行此检查会将简单的for循环变成执行检查或使用类型断言的繁琐练习。问题是(请参阅),编译器无法轻松区分数组类型中的安全索引和不安全索引。因此,要么编译器假设该属性不是未定义的,要么编译器在该假设错误时有错误的否定,就像现在发生的那样。。。。或者,假设该属性可能是
未定义的
,并且在索引操作实际上是安全的情况下,编译器会提供误报。语言维护者的观点是,这种误报会频繁发生,以至于开发人员将自己置于完全忽略错误的状态,从而使错误与当前情况一样无用,同时变得更加烦人。因此,他们将保持现状。TypeScript 4.1的更新 由于下列原因,
未定义
未包含在索引签名属性的域中,这仍然是预期行为。然而,由于这是一个经常被要求的特性,TypeScript团队(有点勉强?)已经让步并添加了。如果您启用了它(默认情况下它既没有启用,也没有包含在
--strict
编译器标志中,因此需要显式地执行),您将开始获得您可能想要的行为

请注意,这实际上与您自己添加
undefined
并不完全相同。索引访问将添加
未定义的

// --noUncheckedIndexedAccess is enabled

const x: number[] = [];
const [first] = x; // number | undefined

console.log(first); // undefined

if (first !== undefined) {
    first.toFixed(); // okay
}
但是,
for..of
循环和数组函数编程方法仍将起作用,就好像
未定义的
是不可能的(即:就好像稀疏数组不存在一样):

因此,您可能希望启用该标志。请记住,一些常见的数组/字典操作技术可能仍然“令人讨厌”,这就是为什么它不是
--strict
系列的一部分


原始答案 这是预期的行为。有关更多信息,请参阅。这个问题是一个请求,允许索引签名属性类型在其域中自动包含
未定义的
,虽然这个问题仍然存在,但很明显它不会实现。例如,见

它(见列表中的第3条)的类型系统是完美的或正确的(尽管像我这样的人当我们想得太多时会感到心痛;我之前开玩笑说要成立一个TypeScript不健全支持小组来帮助人们处理这个问题)。相反,在正确性和可用性之间有一个折衷


语言维护人员注意到,有很多实际代码索引到数组中,而无需到处检查可能的
未定义的
值,并且强制执行此检查会将简单的for循环变成执行检查或使用类型断言的繁琐练习。问题是(请参阅),编译器无法轻松区分数组类型中的安全索引和不安全索引。因此,要么编译器假设该属性不是未定义的,要么编译器在该假设错误时有错误的否定,就像现在发生的那样。。。。或者,假设该属性可能是
未定义的
,并且在索引操作实际上是安全的情况下,编译器会提供误报。语言维护者的观点是,这种误报会频繁发生,以至于开发人员将自己置于完全忽略错误的状态,从而使错误与当前情况一样无用,同时变得更加烦人。因此,他们将保持现状。这就彻底澄清了话题,t