- 已关闭**。此问题需要details or clarity。当前不接受答案。
- 想要改进此问题?**添加详细信息并通过editing this post阐明问题。
13小时前关门了。
Improve this question
我有这个尝试自己TypeScript空Assert的例子,从W3Schools TypeScript空&未定义部分在下面的屏幕截图。
我有点困惑,当一个空Assert操作符!应用于字符串方法时,它是如何有用的,就像这个例子中的那样。
在W3Schools上,TypeScript的推理系统并不完美,有时忽略一个值为空或未定义的可能性是有意义的。TypeScript提供了!操作符作为一个方便的快捷方式。
我的理解是,下面的代码使用一个创建的变量来调用函数。
let value = getValue();
下面显示的getValue函数不带参数,使用简单的字符串类型返回字符串和OR|union以允许空值或未定义的值。
function getValue(): string | undefined {
下面的代码不会在屏幕上显示字符串,因为它使用控制台获取'hello'字符串的长度值
return 'hello';
最后,下面的控制台显示值长度:然后使用字符串长度方法显示字符串"hello"中的字符数,即5
console.log('value length: ' + value!.length);
这是我不清楚的地方:
使用!运算符对字符串长度方法有何影响?
如果我返回没有字符串的'',它会给出0,因为没有字符。
那么对于这个例子,如何测试它是否可以使用undefined呢?
在这样的例子中,undefined真的存在吗?
如果有人能给我一个很好的理解如何这个!操作符可以与这个例子的未定义或没有工作,那么这将是非常感谢的帮助,谢谢?
1条答案
按热度按时间f0brbegy1#
我从编译器或我自己如何解释的Angular 来看待这个问题。
下面的原始代码,我觉得可以写得稍微好一点
原始代码没有带参数,而是在空参数后使用了string和undefined的注解类型。
从这里可以看出,https://www.tutorialsteacher.com/typescript/type-annotation可以在参数()中使用
:
完成此操作,但在这里,它是在参数()
之后使用:
完成的。为什么要在()之后使用注解:?
我不确定这样做是否有更多的优势。
编译器认为放入函数的类型可能是字符串,也可能是未定义的。
稍后,代码编译器可以看到应用了!运算符和.length,然后可以确保提供的值是字符串类型,并且不会是未定义的。
我已经像这样重写了这个原始示例,在字符串中沿着了一个值|参数中有未定义的联合类型。
我更喜欢将值放在参数中,因为理解值通过函数更符合逻辑。
从我的Angular 来看,这个函数只能接受字符串,而且永远不会被定义,因为它只接受字符串。对于“",它仍然认为它是字符串,并返回0表示0个字符,如果尝试一个数字,则会出现实际错误。所以我看到的总体情况是,它永远不会被定义。
然而,从编译器的思维方式来看,它是根据函数和代码告诉它的内容来完成计算的每一步的。
从了解TypeScript中的感叹号文章中可以看出,非空Assert运算符告诉TypeScript编译器,类型为可选的值不能为空或未定义。
它说一个可能定义为字符串或未定义的变量(就像这个例子)可以使用一个!操作符告诉编译器忽略它未定义的可能性。
它有另一个字符串示例,将一个单词改为小写,这是另一个很好的测试器,可以查看!如何操作。
我也看到,就像铸造一样,它可能是不安全的,应该小心使用。
使用!运算符的缺点是它不会改变代码的运行时行为。如果Assert的值为null或未定义,则会发生错误,并在运行时中断代码的执行。
JavaScript不需要使用!运算符,因为没有类型严格性,所以这与TypeScript相反。
使用!运算符会使TypeScript失去防止运行时类型错误的“超能力”。因此,使用!运算符不是最佳做法。请谨慎使用。