我知道一般的解释是编译器会进行静态类型检查,但编译器使用什么方法来验证没有可空类型意外地发挥作用?Typescript 2如何执行非空类型?
回答
TypeScript完全是编译端;所有静态类型在转换为JavaScript时都会丢失。尽管没有理由做这样的事情阻止你:
let foo: { myProperty: string } = { myProperty: "g" }; // myProperty is non-nullable
foo["myProperty"] = undefined; // bypass type checker!
为空性/ undefinedness检查只是在如何式系统模型类型的变化。像往常一样,这一切都发生在类型检查阶段,并且在发射的JavaScript中没有任何东西在运行时强制执行。
无论如何,你可以将类型想象为域的值。例如,boolean
的域通常只是两个值true
和false
。 string
是一个无界域,其中包含字符串"hello"
和"world"
以及其他所有字符串。
TypeScript检查在某个类型位置使用某个值时,该值位于该类型的域中。例如,true
不在number
的域名,所以尝试使用true
是非法的,其中number
是预期的。
在打字稿没有严格的空检查,null
和undefined
在每一个类型的领域。所以boolean
型实际上有四个值:true
,false
,undefined
和null
。正如人们通常发现的那样,这很糟糕,因为undefined
和null
的行为并不完全像true
和false
。对于具有属性和方法的东西,情况更糟,因为substr
作为string
域中每个值的方法存在,除了null
和undefined
,所以它真的很烦人。
在打字稿与严格的空检查,null
和undefined
搬出所有类型的域,并转化为自己的类型。现在,价值null
不能用于string
预期的地方,因为它不再位于string
的域中。 string | null
现在代表的值可能是string
域或的某些成员的特殊值null
。
这个解释是从Anders Hejlsberg's talk from Build 2016 starting around 44:30改编而来的,正如你可能想象的那样,他比我更擅长解释它,尤其是因为他有一些很好的幻灯片陪伴它。
- 1. 如何为TypeScript类执行Joi验证?
- 2. Angular2,TypeScript,Ionic 2代码执行顺序
- 3. 如何在TypeScript 2项目中安装Firebase 3的类型?
- 4. TypeScript类型的类型
- 5. 非空类型'System.DateTime',ASP.NET MVC
- 6. 执行类型
- 7. 如何在Kotlin中执行一个空的非空字符串?
- 8. TypeScript使用相同类型的全局类型名称空间
- 9. 如何在C++/CLI中将非空类型转换为可空?
- 10. 如何将空值赋给C#中的非空类型变量?
- 11. 如何为非ActiveRecord支持的类执行自动类型转换?
- 12. 如何在Typescript中自反泛型类?
- 13. 如何判断TypeScript对象的类型?
- 14. 原型和TypeScript Angular 2
- 15. 无论异常类型如何执行
- 16. 如何执行类型转换?
- 17. 抽象类和非空值类型
- 18. Typescript日期类型?
- 19. 如何在typescript 2中指定具有类型注释的派生类?
- 20. 为空的类型入门类型定义打破了非可空类型
- 21. 如何区分对象类型与Typescript中的数组类型
- 22. Angular 2 Typescript类属性允许分配不正确的类型
- 23. 使用Typescript返回空白或任何其他类型
- 24. “参数字典包含非空参数的非空类型”?
- 25. 如何使用JNI为非可执行JAR设置堆空间
- 26. 如何将非名称空间类型导入IronPython?
- 27. 如何解决“类型错误#2007参数子必须非空”?
- 28. 如何在C#中使非值类型为空?
- 29. 在C#中创建非空值类型#
- 30. 如何使用TypeScript在我的Angular 2组件中声明模型类?
这是正确的,但该代码抛出一个编译错误严格空检查虽然 - “类型未定义不可分配给类型字符串。”它不会绕过类型检查器。 –