【问题标题】:Why does TypeScript not cast number to string in typed property?为什么 TypeScript 不在类型化属性中将数字转换为字符串?
【发布时间】:2019-10-28 12:52:15
【问题描述】:

我今天遇到了一个错误,导致我进行了大量的挖掘和困惑。这完全是由于我假设当 TypeScript 类中的属性定义为 string 时,TypeScript 要么抛出错误,要么将另一种类型转换为 string 表示形式。

我希望以下内容要么在类构造中引发错误,要么参数被转换为字符串。

class A { 

    constructor(public str: string) { 
        console.log(typeof (str));
        console.log(typeof (this.str));
    }

    t() { 
        return typeof (this.str);
    }
}

const a: A = new A(5 as any);
const t = a.t();

// t is now 'number'!!!!

Playground link

当查看生成的 JavaScript 时,似乎很明显这是应该发生的,但我认为 TypeScript 会更健壮,并且此功能是设计使然。

为什么 TypeScript 不能将我的数字类型转换为字符串?

【问题讨论】:

  • 因为 TypeScript 在运行时不存在?目前尚不清楚您为什么做出这些假设,但它们是错误的; TS 会进行编译时类型检查。
  • 那么,如果类型在 TypeScipt 中不能被信任,那有什么意义呢?有点苛刻的家伙。
  • 如果使用得当并且对正在发生的事情有所了解,它们是值得信赖的,但它们并不神奇。单独的 TS 类型不会在运行时导致类型错误或转换,并且使用像 as any 这样的断言会限制它们在编译时的用处。
  • 为什么是一个?生成额外的运行时类型检查/强制转换代码超出了 TS 的目标,您可以从转译的 JS 中看到不存在。同样,TS 是一个编译时类型检查工具。
  • @span TypeScript 只是一个编译时类型检查器。这是该语言的基本设计选择(有效地使其“只是 JavaScript”,具有更好的 auth-time 功能)。您基本上是在问 TS FAQ 涵盖的问题:github.com/Microsoft/TypeScript/wiki/FAQ

标签: typescript


【解决方案1】:

使用as 转换变量应该被认为是危险的。这是一个类型断言——你告诉 Typescript 编译器你比它更了解对象的类型。如果你对 Typescript 编译器撒谎,它并不能帮助你保证程序的安全。

更糟糕的是,您在这里使用了any 类型,这是一种非常宽松的类型。如果你转换为任何其他类型,包括{},你会得到一个编译器错误。不过any can be assigned to any type without error.

【讨论】:

    猜你喜欢
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2022-01-17
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    相关资源
    最近更新 更多