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
为什么我需要将`强制转换为不可为空<;T>;`在检查null和undefined之后? //这是https://msdn.microsoft.com/visualfsharpdocs/conceptual/seq.choose%5b%27t%2c%27u%5d-函数-%5bfsharp%5d 常数选择=( 收藏:T[], 选择器:(元素:T)=>U ):不可为空[]=>{ 常量结果:不可为空[]=[]; for(集合的常量元素){ 常量值=选择器(元素); 如果(值!==未定义&&value!==空){ //push(value);TypeScript抱怨U不能转换为不可为null result.push(值不可为null);//这是有效的 } } 返回结果; };_Typescript - Fatal编程技术网

为什么我需要将`强制转换为不可为空<;T>;`在检查null和undefined之后? //这是https://msdn.microsoft.com/visualfsharpdocs/conceptual/seq.choose%5b%27t%2c%27u%5d-函数-%5bfsharp%5d 常数选择=( 收藏:T[], 选择器:(元素:T)=>U ):不可为空[]=>{ 常量结果:不可为空[]=[]; for(集合的常量元素){ 常量值=选择器(元素); 如果(值!==未定义&&value!==空){ //push(value);TypeScript抱怨U不能转换为不可为null result.push(值不可为null);//这是有效的 } } 返回结果; };

为什么我需要将`强制转换为不可为空<;T>;`在检查null和undefined之后? //这是https://msdn.microsoft.com/visualfsharpdocs/conceptual/seq.choose%5b%27t%2c%27u%5d-函数-%5bfsharp%5d 常数选择=( 收藏:T[], 选择器:(元素:T)=>U ):不可为空[]=>{ 常量结果:不可为空[]=[]; for(集合的常量元素){ 常量值=选择器(元素); 如果(值!==未定义&&value!==空){ //push(value);TypeScript抱怨U不能转换为不可为null result.push(值不可为null);//这是有效的 } } 返回结果; };,typescript,Typescript,为什么我需要演员阵容,有没有一种方法可以输入这样我就不需要了?TypeScript通常能够在检查这些情况的if语句中判断不能为null或未定义的内容。有几种方法可以解决这些问题。您只需删除result const choose=( 收藏:T[], 选择器:(元素:T)=>U ):不可为空[]=>{ 常量结果=[]; for(集合的常量元素){ 常量值=选择器(元素); 如果(值!==未定义&&value!==空){ result.push(value);//这是有效的 } } 返回结果; };

为什么我需要演员阵容,有没有一种方法可以输入这样我就不需要了?TypeScript通常能够在检查这些情况的if语句中判断不能为null或未定义的内容。

有几种方法可以解决这些问题。您只需删除
result

const choose=(
收藏:T[],
选择器:(元素:T)=>U
):不可为空[]=>{
常量结果=[];
for(集合的常量元素){
常量值=选择器(元素);
如果(值!==未定义&&value!==空){
result.push(value);//这是有效的
}
}
返回结果;
};
考虑到您是从F#移植的,更好的解决方案可能是在tsconfig.json中包含严格的空检查,这样您就不必首先显式指定
不可空的


//使用“strictNullChecks”:在tsconfig.json中为true
常数选择=(
收藏:T[],
选择器:(元素:T)=>U
):U[]=>{
常量结果=[];
for(集合的常量元素){
常量值=选择器(元素);
如果(值!==未定义&&value!==空){
结果:推(值);
//result.push(未定义);//无法执行此操作并返回结果
}
}
返回结果;
};
如果将
undefined
按到
result
并试图返回
result
,编译器会抱怨函数的结果类型必须是
U | undefined

你也可以用这样的东西来接受不变性的概念

const choose=(集合:T[],选择器:(elem:T)=>U:U[]=>
收集.减少((p,c)=>{
常量值=选择器(c);
返回值?[…p,value]:p;
}, []);
无论哪种方式,我的建议都是,如果您对处理未定义的影响感兴趣,请打开strictNullChecks(可能,选项,无论您如何称呼它)

每个评论

选择器函数应返回null或undefined

在这种情况下,我建议在函数签名中调用它

const choose=(集合:T[],选择器:(elem:T)=>U |未定义):U[]=>{
常量结果=[];
for(集合的常量元素){
常量值=选择器(元素);
如果(值)结果。推送(值);
}
返回结果;
};

这似乎是不可为空类型的一个限制。存在一个非空断言运算符,您也可以使用它(如中所述),它将导致
result.push(value!)
这可能取决于您的tsconfig.json,但只需删除
result
的内联typedef即可
const result=[]
第二种方法的问题是TypeScript可以推断
U
为,例如
number | null
。我想让这个函数返回一个非空或未定义的数组。而且,第一种方法对我不起作用。TypeScript抱怨说,
U[]
不能转换为
nonnull[]
U
只能是
number | null
,如果传递给
choose
选择器功能允许的话*严格的空检查是正确的,但这是预期的用法。选择器函数有时会返回
null
undefined
;这个函数选择非空的结果并只返回这些结果。啊,你的最后一个例子正是我想要的。谢谢
// This is an implementation of https://msdn.microsoft.com/visualfsharpdocs/conceptual/seq.choose%5b%27t%2c%27u%5d-function-%5bfsharp%5d
const choose = <T, U>(
  collection: T[],
  selector: (elem: T) => U
): NonNullable<U>[] => {
  const result: NonNullable<U>[] = [];
  for (const element of collection) {
    const value = selector(element);
    if (value !== undefined && value !== null) {
      // result.push(value); TypeScript complains that U is not convertible to NonNullable<U>
      result.push(value as NonNullable<U>); // this works
    }
  }
  return result;
};