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

问题描述 投票:0回答:1

我仍在使用打字稿调整编码。我是一名全栈开发人员,使用 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 types casting any
1个回答
1
投票

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

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

any
的存在有一个特定的目的:使打字稿的采用更容易。特别是在早期,代码库从 javascript 开始然后逐段转换为 typescript 是很常见的。
any
是普通 JavaScript 变量所具有的类型,TypeScript 不会对它们执行类型检查,除非它可以推断类型。目的是代码库将从许多
any
开始,并随着时间的推移用真实类型替换它们。

一旦代码库完全或主要采用打字稿,

any
就会阻碍它。他们(按照设计)取消了类型检查,因此他们会让错误溜走。在极少数情况下,它们可以用于告诉打字稿“相信我,我知道我在做什么,所以不要在这里检查我”,但应该避免使用它们。不幸的是,看起来您继承的代码库没有 The Any Police 来对其进行检查。

© www.soinside.com 2019 - 2024. All rights reserved.