提问人:BaiaccuTerrestre_BR 提问时间:10/7/2023 更新时间:10/7/2023 访问量:41
为什么仍然可以在 TypeScript 中将所有类型的变量转换为“any”?[复制]
Why is still possible to cast all types of variable to "any" in TypeScript? [duplicate]
问:
我仍在使用打字稿调整编码。我是一名全栈开发人员,使用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 等获取数据非常有帮助,并且更容易处理可能的异常
答:
我刚刚意识到“任何”选角有多糟糕
我就在你身边。我得到了“任何警察”的绰号,因为我基本上从不让任何人通过代码审查。
any
存在用于特定目的:使打字稿的采用更容易。特别是在早期,代码库以 javascript 开始,然后逐条转换为打字稿是很常见的。 是纯 JavaScript 变量所具有的类型,TypeScript 不会对它们执行类型检查,除非它可以推断类型。其目的是代码库将从许多类型开始,然后加班用真实类型替换它们。any
any
一旦代码库完全或主要在打字稿中,就要阻止它。它们禁用了类型检查(按设计),因此它们将允许错误溜走,例如您提到的错误。在极少数情况下,它们可用于告诉打字稿“相信我,我知道我在做什么,所以不要在这里检查我”,但应该避免使用它们。不幸的是,看起来你继承的代码库没有 The Any Police 来控制它。any
PS,虽然这样做有时被称为“类型转换”,但最好将其称为“类型断言”。你向打字稿断言“相信我,这就是类型”。在运行时实际上没有任何变化,所以如果断言是一个错误,并且它实际上不是那个类型,打字稿就帮不了你了as X
评论
any
作为对许多 TypeScript 项目作为 JavaScript 项目开始这一事实的让步而存在。 是纯 JavaScript 变量所具有的类型。也就是说,它基本上关闭了所有类型检查。所以,是的,断言某物是“任何”可以使一切成为可能,因为这是你告诉打字稿“立即停止检查类型”的方式。any
any
允许开发人员绕过类型系统,并执行他们认为可以但编译器无法验证为安全的事情。它们应该谨慎使用,但有时是不可避免的。为了方便起见,TS 故意允许一些不安全的东西(参见 ms/TS#9825 中的讨论)。这是否完全解决了问题,还是我遗漏了什么?