typescript - 即使在 Typescript 中添加类型断言之后,我们还需要类型注释吗?

标签 typescript type-declaration

如果我们在 Typescript 中指定 as,我们真的需要指定变量的类型吗?

例如:下面的代码给了我相同类型的对象。但是,我想知道执行此操作的正确方法。

const x: Student = {
  name: "John"
}

// is the above same as below

const x = {
  name: "John"
} as Student;

// or do we need to specify both

const x: Student = {
  name: "John"
} as Student;

export interface Student {
  name: string,
  id?: string
}

最佳答案

Type annotationstype assertions满足不同但部分重叠的需求;您确实很少想同时使用两者。


类型注释可以让您显式选择变量的类型。这通常是不必要的;如果没有显式类型注释,变量的类型通常可以是 inferred通过其初始化值的类型。如果该值的类型足以满足您的需求,那么注释本质上是多余的。如果该值的类型不够,那么注释会很有帮助。例如在

const x = { name: "John" }
/* const x: { name: string; } */

编译器将x的类型推断为{name: string}。这可以分配给 Student,因此根据您的用例,它可能就足够了:

function acceptStudent(s: Student) { }
acceptStudent(x); // works

但是如果您愿意,您可以随意使用注释:

const x: Student = {
  name: "John"
}

类型注释的检查相当严格。如果您使用与其初始值设定项不兼容的类型注释变量,您将收到错误:

const x: Student = { // error!
  id: "John",
}

另一方面,类型断言可以让您声明表达式属于某种类型。这主要用于当您对表达式类型的了解比编译器可以验证的更多时...您断言它,尽管编译器无法看到断言是否正确。实际上,另一个用例是当您需要故意向编译器谎报表达式的类型才能继续进行时。同样,这通常也是不必要的,因为编译器对此类表达式的推断类型通常是合理的。但有时您想要更改编译器对表达式类型的看法:

const x = {
  id: "John"
} as Student; // no error

这里编译器不会提示,即使 {id: "John"} 不是有效的 Student。不过,它已经足够接近了,编译器可以接受您的断言。


所以这取决于您的需求。这里的一般建议大致是:更喜欢注释而不是断言,更喜欢推理而不是注释。如果推理足够,那么就使用它。如果没有,则进行注释。如果这仍然不起作用,那么考虑断言(但要小心)。并且使用两者几乎肯定是矫枉过正。一旦断言初始化表达式的类型,该类型将是变量的推断类型,因此注释是多余的。

Playground link to code

关于typescript - 即使在 Typescript 中添加类型断言之后,我们还需要类型注释吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76386048/

相关文章:

Angular Material 自动完成显示 TypeError : Cannot read property 'createEmbeddedView' of undefined

angular - 如何在 Angular 数据类型上使用 ngSwitch?

arrays - 有没有办法在 TypeScript 中将多种类型的数据放入数组中?

haskell - 如何与外部上下文中的类型相关联

typescript 。函数类型

javascript - Angular2 - NgIf 无法从订阅访问我的变量

reactjs - axios.delete(url[,config]) : Type has no properties in common with type 'AxiosRequestConfig'

dictionary - 在结构中声明和使用映射

javascript - 将命名空间分配给 src 库文件