Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Typescript 自动为字段或属性创建用户定义的类型保护?_Typescript - Fatal编程技术网

Typescript 自动为字段或属性创建用户定义的类型保护?

Typescript 自动为字段或属性创建用户定义的类型保护?,typescript,Typescript,在使某些代码严格兼容模式时,我经常遇到如下模式: 接口项{ foo?:foo; } 接口Foo{ 酒吧:字符串; } 声明常量项:项[]; items.filter(item=>!!item.foo.map(item=>item.foo.bar);//错误!item.foo可能未定义 这会在--stricnullchecks中创建错误,因为定义了item.foo的信息不会传播 总的来说,我一直在创建一次性的防护装置来处理类似的事情 函数hasFoo(item:item):item是item&{

在使某些代码严格兼容模式时,我经常遇到如下模式:

接口项{
foo?:foo;
}
接口Foo{
酒吧:字符串;
}
声明常量项:项[];
items.filter(item=>!!item.foo.map(item=>item.foo.bar);//错误!item.foo可能未定义
这会在
--stricnullchecks
中创建错误,因为定义了
item.foo
的信息不会传播

总的来说,我一直在创建一次性的防护装置来处理类似的事情

函数hasFoo(item:item):item是item&{foo:foo}{
return!!item.foo;
}
items.filter(hasFoo.map)(item=>item.foo.bar);
但对于我使用此模式的每一种类型,都需要定义大量的自定义代码。有没有办法编写一个返回自定义类型保护的函数

我想写一些像这样的东西:

items.filter(hasField('foo')).map(item=>item.foo.bar);

您可以编写一个高阶函数,返回用户定义的类型保护。您可能会认为这是用户定义的类型守护工厂。

函数hasField(键:K){
退货(项目:T):项目为(T&Required)=>{
返回项的类型[键]!==“未定义”;
}
}
其用法如下:

items.filter(hasField('foo')).map(items=>items.foo.bar);
这将断言给定的字段是可用的,并且它不是未定义的