为什么函数和变量的类型注释不同?

我认为以下代码将 type 分配string给 type unknown,但编译器给出了相反的错误消息。

let y: (arg: unknown) => any;
let y1: unknown

y = (s: string) => s // Type 'unknown' is not assignable to type 'string'.ts(2322)
y1 = "y1"

亚历克斯·韦恩

因为可以从其他地方调用函数。

以这个为例:

let y: (arg: unknown) => any = (arg) => arg
y(123) // fine

这是一个完全可以接受的调用y(). unknown可以是任何东西,所以传递一个数字就可以了。

现在这样做:

let y: (arg: unknown) => any = (arg) => arg
y = (s: string) => s.toUpperCase()
y(123) // crash

number将不再是 for 的有效参数,y()因为(s: string) => any会让函数假设参数是 a string,但这里不能保证。

这意味着函数类型中的参数类型unknown必须可分配给您分配的参数类型string(因为您仍然可以使用unknown参数调用函数)。并且unknown不可分配给string

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

类型注释是必需的-为什么关联类型被不同地对待?

当从函数以'const'返回时,为什么原始类型和用户定义类型的行为不同?

为什么Catch 子句变量类型注释必须是any?

即使变量是引用类型,为什么Equals和ReferenceEquals方法的结果也不同?

Scala语法:为什么使用括号和花括号对匿名函数参数类型的解析不同?

为什么在实例化类时使用不同的类型和构造函数?

为什么不能正确注释该函数的类型(错误:通用类型的类型参数丢失)?

为什么Java变量声明中的类型不同?

为什么可以给变量分配不同类型的值?

为什么这两个函数的类型不同?

为什么 std::function 可以绑定不同类型的函数?

当我在Rust函数中注释类型时,为什么会出现错误“预期类型参数”?

竖线“ |”是什么 (管道)函数自变量类型注释是什么意思?

为什么我的函数不能接受char变量类型?

为什么System.Void和unit类型不同?

为什么在Python中会颠倒和排序不同的类型?

为什么方法和类型对方差施加不同的约束?

为什么find()和position()的谓词需要不同的类型?

这两种类型注释之间有何区别?为什么不同?

为什么Object和var变量的行为不同?

为什么给定常量和变量的位数不同?

为什么从方法和外部读取的类变量不同?

为什么Dart倾向于忽略局部变量的类型注释?

为什么抽象变量需要在Scala中进行类型注释?

注释@Id和@GeneratedValue(strategy = GenerationType.IDENTITY)的用途是什么?为什么世代类型是身份?

Kotlin类型擦除-为什么只编译通用类型不同的函数却不能编译仅返回类型不同的函数?

为什么/ * * /注释的行为不同?Javascript错误?

为什么列表函数和列表文字的行为不同?

为什么类和函数在Javascript中的行为不同?