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中根本不存在类型,所以遗憾的是,这里需要手动断言。无论如何,这是一个有趣的例子!