为什么我需要将`强制转换为不可为空<;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通常能够在检查这些情况的if语句中判断不能为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);//这是有效的 } } 返回结果; };
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;
};