Typescript 理解类型资产
我只是从typescript开始,虽然我认为事情会很简单,但typescript似乎与javascript不太相似,而且有点令人困惑 无论如何,在typescript中(不确定我的代码是否有效),这样做有什么区别Typescript 理解类型资产,typescript,Typescript,我只是从typescript开始,虽然我认为事情会很简单,但typescript似乎与javascript不太相似,而且有点令人困惑 无论如何,在typescript中(不确定我的代码是否有效),这样做有什么区别 const ua: string = req.headers['user-agent']! 或者根据这个答案,像这样: const us=req.headers['user-agent']! Ps:我不确定哪一个代码是有效的。我的意思是区别在于,在第一个示例中,您声明 类型
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
typeconst ua = <string>req.headers['user-agent']!
const ua=req.headers['user-agent']!
ua
,但不指定其类型string
type- 如果您的类型断言适用于该值
- 如果以上是好的,那么它将从这个任务中推断
ua的类型
两个表达式都有效。但他们的意思不同 案例1:
const ua: string = req.headers['user-agent']!
ua
,并将其标记为string
typeconst ua = <string>req.headers['user-agent']!
const ua=req.headers['user-agent']!
ua
,但不指定其类型string
type- 如果您的类型断言适用于该值
- 如果以上是好的,那么它将从这个任务中推断
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