Typescript 理解类型资产

Typescript 理解类型资产,typescript,Typescript,我只是从typescript开始,虽然我认为事情会很简单,但typescript似乎与javascript不太相似,而且有点令人困惑 无论如何,在typescript中(不确定我的代码是否有效),这样做有什么区别 const ua: string = req.headers['user-agent']! 或者根据这个答案,像这样: const us=req.headers['user-agent']! Ps:我不确定哪一个代码是有效的。我的意思是区别在于,在第一个示例中,您声明 类型

我只是从typescript开始,虽然我认为事情会很简单,但typescript似乎与javascript不太相似,而且有点令人困惑

无论如何,在typescript中(不确定我的代码是否有效),这样做有什么区别

    const ua: string = req.headers['user-agent']!
或者根据这个答案,像这样:

const us=req.headers['user-agent']!

Ps:我不确定哪一个代码是有效的。

我的意思是区别在于,在第一个示例中,您声明 类型字符串的常量为其分配请求头的“用户代理”值。

在第二个示例中,您将声明常量键入any,并将其显式转换为req头的“用户代理”的类型字符串值。

我不确定我是否回答了你的问题,如果没有,请提供更多的上下文。
两个代码示例都是“有效的”。

我的意思是区别在于,在第一个示例中,您声明 类型字符串的常量为其分配请求头的“用户代理”值。

在第二个示例中,您将声明常量键入any,并将其显式转换为req头的“用户代理”的类型字符串值。

我不确定我是否回答了你的问题,如果没有,请提供更多的上下文。
两个代码示例都是“有效的”。

两个表达式都是有效的。但他们的意思不同

案例1:

const ua: string = req.headers['user-agent']!
  • 您可以声明一个变量
    ua
    ,并将其标记为
    string
    type
  • 你给它赋值
  • typescript将检查该值是否适合分配给该变量
  • 案例2:

    const ua = <string>req.headers['user-agent']!
    
    const ua=req.headers['user-agent']!
    
  • 声明变量
    ua
    ,但不指定其类型
  • 您可以为其分配一个值,手动键入该值,并断言为
    string
    type
  • typescript将检查:
    • 如果您的类型断言适用于该值
    • 如果以上是好的,那么它将从这个任务中推断
      ua的类型

  • 两个表达式都有效。但他们的意思不同

    案例1:

    const ua: string = req.headers['user-agent']!
    
  • 您可以声明一个变量
    ua
    ,并将其标记为
    string
    type
  • 你给它赋值
  • typescript将检查该值是否适合分配给该变量
  • 案例2:

    const ua = <string>req.headers['user-agent']!
    
    const ua=req.headers['user-agent']!
    
  • 声明变量
    ua
    ,但不指定其类型
  • 您可以为其分配一个值,手动键入该值,并断言为
    string
    type
  • typescript将检查:
    • 如果您的类型断言适用于该值
    • 如果以上是好的,那么它将从这个任务中推断
      ua的类型
  • 这意味着您创建了一个名为
    ua
    的新变量,该变量被显式设置为字符串类型并为其赋值。如果尝试将非字符串的内容分配给同一变量,例如
    const ua:string=42

    const us = <string> req.headers['user-agent']!
    

    当您使用
    执行显式类型断言时,您可以保证TS将猜测类型为
    字符串


    在这两种方法中,第一种更安全,因为您知道您需要一个字符串,如果不是,那么您将得到一个编译时错误。第二种方法依赖于隐式类型猜测,这实际上可能是错误的。这意味着在编译时这将是正确的,因为您已经否决了编译器,但不一定在运行时工作。以下是一个例子:

    let a = <string> getData();
    
    function getData(): string | number {
        return 42;
    }
    

    您现在正确地得到了一个编译时错误,因为您应该处理得到不同类型时发生的情况

    因此,通常应该避免手动类型断言。它可能会导致错误,这些错误最初可能不存在,但以后可能会出现-例如,上面的代码最初可能只有
    getData
    返回
    string
    ,因此在这一点上,变量
    a
    的显式和隐式类型之间没有区别。通过
    进行类型断言是多余的。但是,如果函数随后更改为返回
    string | number
    ,则显式类型断言将变得不可靠

    这意味着您创建了一个名为
    ua
    的新变量,该变量被显式设置为字符串类型并为其赋值。如果尝试将非字符串的内容分配给同一变量,例如
    const ua:string=42

    const us = <string> req.headers['user-agent']!
    

    当您使用
    执行显式类型断言时,您可以保证TS将猜测类型为
    字符串


    在这两种方法中,第一种更安全,因为您知道您需要一个字符串,如果不是,那么您将得到一个编译时错误。第二种方法依赖于隐式类型猜测,这实际上可能是错误的。这意味着在编译时这将是正确的,因为您已经否决了编译器,但不一定在运行时工作。以下是一个例子:

    let a = <string> getData();
    
    function getData(): string | number {
        return 42;
    }
    

    您现在正确地得到了一个编译时错误,因为您应该处理得到不同类型时发生的情况

    因此,通常应该避免手动类型断言。它可能会导致错误,这些错误最初可能不存在,但以后可能会出现-例如,上面的代码最初可能只有
    getData
    返回
    string
    ,因此在这一点上,变量
    a
    的显式和隐式类型之间没有区别。通过
    进行类型断言是多余的。但是,如果函数随后更改为返回
    string | number
    ,则显式类型断言将变为unrel