我正在处理一个类型脚本项目,在该项目中,我遇到了一个关于构造函数参数和接口中的可选属性的有趣行为.看起来,类型脚本允许我将具有可选属性的对象传递给构造函数,即使构造函数的参数类型是非可选类型.

// StartPaymentReq Interface
export interface StartPaymentReq {
  email?: string;
}

// Payment Class
export class Payment {
  email: string;

  constructor(email: string) {
    this.email = email;
  }
}

// Inside some function or method
const { email }: StartPaymentReq = req.body; // Destructuring from req.body, email inferred as `string | undefined`

const payment = new Payment(email); // No TypeScript warning or error even if email can be undefined

预期行为:

我预计在将带有可选属性的对象传递给Payment构造函数时,TypeScrip会引发警告或错误,因为Payment类中的Email属性没有标记为可选.

实际行为:

当我将带有可选属性的对象传递给Payment构造函数时,Type脚本不会引发警告或错误,即使构造函数需要Email属性的非可选字符串参数.

问题:

  1. 这种行为在类型脚本中是故意的吗,允许将可选属性传递给期望非可选参数的构造函数?
  2. 在这种情况下,TypeScrip是否应该发出警告或错误,以在开发过程中强制执行更严格的类型判断?
  3. 在构造需要非可选参数的对象时,处理可选属性的最佳实践是什么?

推荐答案

最可能的原因是您没有在tsconfig中将"strict"设置为True.TypeScrip只是一种超级类型的Java脚本.因此,在最基本的层面上,这将能够很好地编译为Java脚本.除了简单地不提供参数之外,JavaScript没有"可选参数"的概念.如果您有一个想要转换为TS的JS项目,这种松散的TypeScrip编译非常有用.它可以让你像编译TS一样编译JS,而不会出现任何错误,所以你可以慢慢采用.

但是,如果您在配置中将Strong设置为True,TS编译器将假定所有内容都是完全可靠的类型,并且不会在运行时编译任何不安全的内容.

Typescript相关问答推荐

Angular -使用Phone Directive将值粘贴到控件以格式化值时验证器不工作

您可以创建一个类型来表示打字员吗

有没有办法适当缩小类型?

如何将联合文字类型限制为文字类型之一

通过字符串索引访问对象';S的值时出现文字脚本错误

为什么在回调函数的参数中不使用类型保护?

Vue3 Uncaught SyntaxError:每当我重新加载页面时,浏览器控制台中会出现无效或意外的令牌

FatalError:Error TS6046:';--模块分辨率';选项的参数必须是:'; node ';,'; node 16';,'; node

Angular 自定义验证控件未获得表单值

有没有办法取消分发元组的联合?

如何正确调用创建的类型?

使用或属性编写无限嵌套的接口

递归生成常量树形 struct 的键控类型

类型';只读<;部分<;字符串|记录<;字符串、字符串|未定义&>';上不存在TS 2339错误属性.属性&q;x&q;不存在字符串

定义一个只允许来自另一个类型的特定字符串文字的类型的最佳方式

React中的效果挂钩在依赖项更新后不会重新执行

我是否应该在 Next.js 中的服务器组件中获取秘密数据的所有函数中使用使用服务器?

使用受保护的路由和入门来响应路由

根据索引将元组拆分为两个块

当并非所有歧视值都已知时,如何缩小受歧视联盟的范围?