为什么仍然可以在 TypeScript 中将所有类型的变量转换为“any”?[复制]

Why is still possible to cast all types of variable to "any" in TypeScript? [duplicate]

提问人:BaiaccuTerrestre_BR 提问时间:10/7/2023 更新时间:10/7/2023 访问量:41

问:

我仍在使用打字稿调整编码。我是一名全栈开发人员,使用C#(一种OOP语言)。我真的不喜欢动态类型语言,幸运的是,我仍然不需要使用任何语言。

我刚刚意识到“任何”铸造是多么糟糕,特别是对于乞讨者和不习惯 OOP 的人。我的意思是,通用方法可以返回任何值 - 至少我可以处理它 - 例如使用 axios、rxjs 或从本地存储中检索数据,因为它们的类型确实可以变化。

但真正让我烦恼的是这是非法的:

class C1 {id: string}
class C2 {num: number}

const c1 = new C1()
const c2: C2 = c1;

但是对于打字稿来说,这是完全可以的:

class C1 {/*...*/}
class C2 {/*...*/}

const c1 = new C1();
const c2: C2 = c1 as any;

我目前正在开发的应用程序有一堆这样的铸件,通常当我复制任何东西时,这会导致很多麻烦,产生错误等。

这完全是无稽之谈,就像“哦,一个错误?让我投“任何”。作品😍“和砰!炸弹被设置好了

有人可以向我解释这种可能性是否有任何真正的效用吗?

我实际上同意 OOP,即当我们创建泛型方法时,我们必须设置一个类型,当我们声明函数或方法时 - 我知道,在 C# 中有对象类型,但这确实很少见,强烈建议不使用 - 并且 TS 具有完全相同的功能:

// C# E.g.:
public T GenericMethod<T>() {
  //...
}

var c1 = GenericMethod<C1>();

// TS E.g.:
genericMethod<T>() {}
// or even
genericMethod = <T>() => ({} as T);

这个标准对于从 DB Contexts、localStorage、axios 等获取数据非常有帮助,并且更容易处理可能的异常

TypeScript 类型 强制转换 任何

评论

3赞 Nicholas Tower 10/7/2023
any作为对许多 TypeScript 项目作为 JavaScript 项目开始这一事实的让步而存在。 是纯 JavaScript 变量所具有的类型。也就是说,它基本上关闭了所有类型检查。所以,是的,断言某物是“任何”可以使一切成为可能,因为这是你告诉打字稿“立即停止检查类型”的方式。any
1赞 jcalz 10/7/2023
类型断言any 允许开发人员绕过类型系统,并执行他们认为可以但编译器无法验证为安全的事情。它们应该谨慎使用,但有时是不可避免的。为了方便起见,TS 故意允许一些不安全的东西(参见 ms/TS#9825 中的讨论)。这是否完全解决了问题,还是我遗漏了什么?

答:

2赞 Nicholas Tower 10/7/2023 #1

我刚刚意识到“任何”选角有多糟糕

我就在你身边。我得到了“任何警察”的绰号,因为我基本上从不让任何人通过代码审查。

any存在用于特定目的:使打字稿的采用更容易。特别是在早期,代码库以 javascript 开始,然后逐条转换为打字稿是很常见的。 是纯 JavaScript 变量所具有的类型,TypeScript 不会对它们执行类型检查,除非它可以推断类型。其目的是代码库将从许多类型开始,然后加班用真实类型替换它们。anyany

一旦代码库完全或主要在打字稿中,就要阻止它。它们禁用了类型检查(按设计),因此它们将允许错误溜走,例如您提到的错误。在极少数情况下,它们可用于告诉打字稿“相信我,我知道我在做什么,所以不要在这里检查我”,但应该避免使用它们。不幸的是,看起来你继承的代码库没有 The Any Police 来控制它。any


PS,虽然这样做有时被称为“类型转换”,但最好将其称为“类型断言”。你向打字稿断言“相信我,这就是类型”。在运行时实际上没有任何变化,所以如果断言是一个错误,并且它实际上不是那个类型,打字稿就帮不了你了as X

评论

0赞 BaiaccuTerrestre_BR 10/9/2023
谢谢你的回答。我对“任何警察”都赞不绝口,哈哈,这真是太棒了。但似乎令人敬畏的是,打字稿在代码安全方面失败了,对乞丐友好。这可能会给公司带来严重的错误,从而导致金钱损失。难道没有任何官方表格可以投票支持这个“功能”结束吗?
1赞 Nicholas Tower 10/9/2023
他们改变它的可能性基本上为 0。这是经过深思熟虑的,我认为易于采用是打字稿越来越受欢迎的主要原因之一。我建议的是选择以严格的方式使用打字稿。更具体地说,我建议打开严格模式,并使用 lint 规则禁止使用 .any