Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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
guard的TypeScript实例失败_Typescript - Fatal编程技术网

guard的TypeScript实例失败

guard的TypeScript实例失败,typescript,Typescript,这一行代码似乎很简单: const dates:Date[]=[1,new Date()]。过滤器(num=>num instanceof Date) 但是,它失败并出现以下错误: Type'(number | Date)[]不能分配给Type'Date[]' 为什么TypeScript不能推断dates中唯一的项来自Date类?不幸的是,TypeScript不能正确推断这一点,但如果在筛选函数中使用类型谓词,它会起作用: const dates: Date[] = [1, new Date()

这一行代码似乎很简单:

const dates:Date[]=[1,new Date()]。过滤器(num=>num instanceof Date)

但是,它失败并出现以下错误:

Type'(number | Date)[]不能分配给Type'Date[]'


为什么TypeScript不能推断dates中唯一的项来自Date类?

不幸的是,TypeScript不能正确推断这一点,但如果在筛选函数中使用类型谓词,它会起作用:

const dates: Date[] = [1, new Date()].filter((num): num is Date => num instanceof Date)

因为
1
不是日期。您可以添加
作为日期来避免它。它是如何简单明了的<代码>过滤器
不会改变返回类型
map
执行此操作时,您正在过滤原始数组,该数组是
(数字|日期)[
,因此,由于已过滤,因此结果将是
(数字|日期)[
。在这种情况下,typescript没有什么问题。如果明确确定结果为日期[],只需将其强制转换为:
为日期[]
。请记住,您使用的是无类型语言上的类型。在运行时,所有这些都将不存在。我认为这很简单,这里filter语句的返回值与Date[]100%兼容,事实上除了任何[]之外,没有其他类型的语句可以工作。但我明白你的意思@briosheje,在这句话之后,我可以做一个dates.push(2),所以TypeScript推断出我的类型,而不是它会弄错。我将显式添加一个类型断言。@Breck此处的类型断言是强制性的,因为typescript是一个传输程序,并且因为它传输代码,所以它不查看代码值,也不知道在运行时数组将是什么类型。在您的例子中,您告诉typescript这样的数组特别是
Date
数组,因为它最初是混合类型的。我确实理解您的观点,但您仍然应该认为,在运行时,所有这些检查都是无用的,因为javascript中根本不存在类型,所以遗憾的是,这里需要手动断言。无论如何,这是一个有趣的例子!