打字稿3.5.3为什么对象类型`{sub:123}`推断为字符串?

时间:2019-08-02 10:34:13

标签: typescript

打字稿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'.

1 个答案:

答案 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

好吧;希望能有所帮助。祝你好运!

Link to code