gpt4 book ai didi

typescript - 尽管进行了严格的空检查,但具有非空文字字符串类型的未初始化字段仍未定义?

转载 作者:搜寻专家 更新时间:2023-10-30 21:01:53 25 4
gpt4 key购买 nike

我相信下面说明的行为是 Typescript 中的一个错误,并打开了 https://github.com/Microsoft/TypeScript/issues/15170 .该问题中的代码示例比下面的代码更清楚地说明了这个问题。


考虑 undefined-literal-string-field.ts 中的以下代码:

class Foo {
public foo: 'foo';
}

const foo = new Foo();

console.log('Foo ', foo.foo);

注意 Foo.foo 有一个 literal string type包含undefined。换句话说,请注意类型只是 'foo',但不是 'foo' |未定义

在 Typescript 2.2 中,此代码使用 --strictNullChecks 编译:

$ node_modules/.bin/tsc --version
Version 2.2.2
$ node_modules/.bin/tsc --strictNullChecks undefined-literal-string-field.ts

但是,该字段在运行时未定义:

$ node undefined-literal-string-field.js
Foo undefined

显然这是因为它没有在生成的 JS 代码中初始化:

var Foo = (function () {
function Foo() {
}
return Foo;
}());
var foo = new Foo();
console.log('Foo ', foo.foo);

我可能误解了 --strictNullChecks,但据我所知,这个标志应该禁止将 undefined 作为值,除非类型是与 undefined< 的联合,即 'foo' |未定义。这里不是这种情况。

为什么 Typescript 编译器允许我访问类型不允许值 undefined未初始化字段?这不是很不合理吗?

而且——鉴于 foo 的类型只允许一个值——为什么编译器不自动用它允许的这个值初始化它?

我在这里错过了什么?

最佳答案

正如您所写的 foo字段未在您的代码中初始化。编译器不会在 console.log 中出现任何错误行是因为从他的角度来看,类的对象Foo有这样的字段(它的初始化与否是编译器不需要担心的另一回事)。

关于第二个问题why the compiler wont initialize the field?答案很简单——foo: 'foo' definition 只是一个type 定义。应在代码中按目的初始化正确的值。

如果你想要 foo具有将被初始化的默认值您可以将类更改为:

class Foo {
public foo: 'foo' = 'foo';
}

这应该正确地初始化它。

关于typescript - 尽管进行了严格的空检查,但具有非空文字字符串类型的未初始化字段仍未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43364822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com