打字稿3.5.3
def extract_zip(file, destination)
FileUtils.mkdir_p(destination)
Zip.on_exists_proc = true
Zip::File.open(file) do |zip_file|
zip_file.each do |f|
fpath = File.join(destination, f.name)
zip_file.extract(f, fpath) unless File.exist?(fpath)
end
end
end
传递给参数类型为{ sub: 123 }
的函数时推断为String。
示例
string | object
错误消息
function foo(bar: string | object) {
return 'test';
}
foo({ sub: 123 });
我希望它推断为error TS2326: Types of property 'sub' are incompatible.
Types of property 'sub' are incompatible.
Type 'number' is not assignable to type '(() => string) | undefined'.
。
答案 0 :(得分:0)
这是TypeScript 3.5中的known bug,是与(generally) improved support for excess property checking in union types一起引入的。
这里的问题是string
值中有一些已弃用的HTML wrapper methods,它输出由一些HTML标记包围的字符串的版本。其中之一是sub
。观看这种疯狂行为:
console.log("wat".sub()); // <sub>wat</sub>
TS3.5中新的多余属性检查查看了string | object
和值{sub: 123}
,并说:“好吧,string
具有类型为{{ 1}},而sub
没有已知的()=>string
属性,因此我们将在这里通过使object
的{{1}}属性仅接受{{ 1}}。这意味着我们需要sub
的类型为object
,而sub
与之不符。错误!”
目前,您必须使用某种类型的扩展或断言来解决此问题:
undefined
幸运的是,这个错误看起来像是fixed in TypeScript 3.6。我认为,解决方法是在进行多余的属性检查时,仅忽略联合中的sub
之类的原始类型。
(()=>string) | undefined
因此您的代码将再次开始工作。但是,您可以期望以下操作继续失败:
123
好吧;希望能有所帮助。祝你好运!