TypeScript中Date|null联合类型属性为何输出undefined
问题原因
TypeScript的类型约束和实际运行结果不符,本质是对TS类型系统的生效边界理解存在偏差,具体原因如下:
- TS的所有类型检查只在编译阶段生效,代码编译为可运行的JavaScript时,所有接口、类型标注都会被完全删除,根本不会在运行时校验你传的参数是不是符合
Props定义。你写的date: Date | null约束,只能在编码、执行TS编译的时候提示类型错误,管不到实际运行时传进来什么值。 - 你调用
MyTimestamp组件的时候漏传了date属性。正常开启TS严格模式的情况下,漏传必填属性编译阶段就会抛出错误,但如果你关闭了严格校验、或是用动态传值、在纯JS代码里调用组件绕开了TS检查,编译环节就不会拦截这个错误。 - 你定义的
date是必填属性,TS不会自动为它补默认值,运行时解构一个不存在的对象属性,拿到的结果本来就是undefined。
要规避这类问题,最直接的方式是打开TS配置里的
strict: true,从编译阶段就拦住漏传参数的错误;如果需要兼容运行时的异常传参,可以给date设置默认值,或者在组件内部加一层运行时判断逻辑。
内容的提问来源于stack exchange,提问作者Blankman
相关产品推荐
相关产品推荐

