Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript TypeScript中泛型的行为_Javascript_Typescript - Fatal编程技术网

Javascript TypeScript中泛型的行为

Javascript TypeScript中泛型的行为,javascript,typescript,Javascript,Typescript,我想学习一点TS,我正在跟随这位官员 我在这一章 从指南中: function identity(arg: any): any { return arg; } 它们声明如下: 虽然使用any肯定是通用的,因为它会导致函数接受arg类型的任何和所有类型,但实际上我们正在丢失有关函数返回时该类型是什么的信息。如果我们传入一个数字,我们唯一的信息就是可以返回任何类型 现在让我们来观察这段代码: let whatIsMyType = identity(666); typeof whatIsMy

我想学习一点TS,我正在跟随这位官员

我在这一章

从指南中:

function identity(arg: any): any {
    return arg;
}
它们声明如下:

虽然使用any肯定是通用的,因为它会导致函数接受arg类型的任何和所有类型,但实际上我们正在丢失有关函数返回时该类型是什么的信息。如果我们传入一个数字,我们唯一的信息就是可以返回任何类型

现在让我们来观察这段代码:

let whatIsMyType = identity(666);
typeof whatIsMyType; // number
我没有丢失类型信息。他们指的是什么样的损失

进一步阅读,指南建议使用T型,如:

function identity<T>(arg: T): T {
    return arg;
}
以及泛型类型为T的函数:

function identity<T>(arg: T): T {
return arg;
现在,我了解了早期预警的好处,我也了解了任何特征。我不明白的是,为什么说我丢失了类型,我应该使用“T”签名

这更复杂,基本上是相同的

现在让我们来观察这段代码: 设whatIsMyType=identity(666); whatIsMyType的类型;//数字 我没有丢失类型信息。他们指的是什么样的损失

这是关于静态类型信息和运行时类型信息之间的区别。TypeScript是关于静态类型信息的,TypeScript编译器可以使用这些信息来帮助您保持程序代码的正确性。但是
typeof
(在该上下文中)是一个运行时操作,告诉您在运行时使用
typeof
时变量
whatIsMyType
中存储了什么类型的值

如果您将该代码粘贴到
whatIsMyType
变量中并将鼠标悬停在该变量上,您将看到该变量具有类型
any
,这意味着您可以在调用
标识后愉快地将
“foo”
分配给它:

function identity(arg: any): any {
    return arg;
}
let whatIsMyType = identity(666);
console.log(whatIsMyType);
whatIsMyType = "foo";          // No error here
console.log(whatIsMyType);
无论出于何种目的,该变量都是松散类型的,就像JavaScript变量一样

TypeScript的目标,它存在的理由,是静态类型检查
any
实际上是在静态类型检查没有用处(甚至由于第三方集成而不可能)的情况下(它们确实存在,但很少)的一个逃生舱

一旦编译成纯JS,它们看起来都一样:

function identity(arg) {
    return arg;
}
对。TypeScript使用的静态类型信息不是最终输出的一部分。这是编译时的事情,不是运行时的事情。但是请注意,如果运行以下代码,使用泛型将如何改变事情:

…和其他需要值的位置(值上下文),例如赋值的右侧:

a = value_expected_here;
如果在类型上下文中使用
typeof
,则它是TypeScript的
typeof
运算符。例如,如果您有此声明:

let a: type_expected_here;
let foo: number = 42;
…您可以使用
typeof bar
声明类型与
foo
相同的变量:

由于
typeof
的用法是预期的类型,因此
a
将具有类型
number
,因为这是
foo
的类型。如果将
foo
的声明改为字符串,
a
的类型将随之改变

相比之下:

let a = typeof foo;
那里,
typeof
在一个值上下文中,因此它是JavaScript的运行时
typeof
关键字,
a
将获得值(而不是类型)
“number”
(在那个特定的示例中,
a
的类型将被推断为
字符串,因为JavaScript的
typeof
结果总是这样)

这一点一开始看起来很混乱,但随着时间的推移会越来越清晰

遗憾的是,TypeScript的
typeof
没有在文档中得到很好的描述:-|


请注意,以上所有内容都是从TypeScript的角度进行的。静态类型检查是帮助还是阻碍取决于您自己。:-)但是为了这个答案,我假设了一个TypeScript透视图

现在让我们来观察这段代码: 设whatIsMyType=identity(666); whatIsMyType的类型;//数字 我没有丢失类型信息。他们指的是什么样的损失

这是关于静态类型信息和运行时类型信息之间的区别。TypeScript是关于静态类型信息的,TypeScript编译器可以使用这些信息来帮助您保持程序代码的正确性。但是
typeof
(在该上下文中)是一个运行时操作,告诉您在运行时使用
typeof
时变量
whatIsMyType
中存储了什么类型的值

如果您将该代码粘贴到
whatIsMyType
变量中并将鼠标悬停在该变量上,您将看到该变量具有类型
any
,这意味着您可以在调用
标识后愉快地将
“foo”
分配给它:

function identity(arg: any): any {
    return arg;
}
let whatIsMyType = identity(666);
console.log(whatIsMyType);
whatIsMyType = "foo";          // No error here
console.log(whatIsMyType);
无论出于何种目的,该变量都是松散类型的,就像JavaScript变量一样

TypeScript的目标,它存在的理由,是静态类型检查
any
实际上是在静态类型检查没有用处(甚至由于第三方集成而不可能)的情况下(它们确实存在,但很少)的一个逃生舱

一旦编译成纯JS,它们看起来都一样:

function identity(arg) {
    return arg;
}
对。TypeScript使用的静态类型信息不是最终输出的一部分。这是编译时的事情,不是运行时的事情。但是请注意,如果运行以下代码,使用泛型将如何改变事情:

…和其他需要值的位置(值上下文),例如赋值的右侧:

a = value_expected_here;
如果在类型上下文中使用
typeof
,则它是TypeScript的
typeof
运算符。例如,如果您有此声明:

let a: type_expected_here;
let foo: number = 42;
…您可以使用
typeof bar
声明类型与
foo
相同的变量:

因为
typeof
的用法就是类型是ex