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
Javascript 创建类似lodash的东西的最佳方法是在typescript中获取?_Javascript_Typescript_Lodash - Fatal编程技术网

Javascript 创建类似lodash的东西的最佳方法是在typescript中获取?

Javascript 创建类似lodash的东西的最佳方法是在typescript中获取?,javascript,typescript,lodash,Javascript,Typescript,Lodash,我试图找到创建lodashget()函数类型安全版本的最佳方法。 我做了研究,提出了一个get函数,它的工作原理是这样的(实际类型有点复杂): 但是我真的不喜欢“!”语法。感觉没有必要。 我已经找到了一些替代方法,尝试将给定对象转换为“全部可选”类型(部分),但当尝试将其转换回真实对象时,情况会变得糟糕,我不喜欢它 有没有办法摆脱“!”语法? 我甚至想过为typescript编写一个自定义规则,如果我们在get函数的上下文中,它将吞掉“Object is mayby'undefined.ts(2

我试图找到创建lodash
get()
函数类型安全版本的最佳方法。 我做了研究,提出了一个get函数,它的工作原理是这样的(实际类型有点复杂):

但是我真的不喜欢“!”语法。感觉没有必要。 我已经找到了一些替代方法,尝试将给定对象转换为“全部可选”类型(部分),但当尝试将其转换回真实对象时,情况会变得糟糕,我不喜欢它

有没有办法摆脱“!”语法? 我甚至想过为typescript编写一个自定义规则,如果我们在get函数的上下文中,它将吞掉“Object is mayby'undefined.ts(2532)”错误,但我不知道typescript是否允许这种东西

有什么建议吗

编辑:对于那些对函数的完整声明感兴趣的人,我使用了函数重载来覆盖所有情况,所以看起来像这样:

get(() => a!.b!.c!.d, 'someDefaultValue');
export function get<Target>(getter: () => Target): Target | undefined;
export function get<Target>(getter: () => Target, defaultValue: Target): Target;
export function get(getter: () => any, defaultValue?: any): any {
  try {
    return getter();
  } catch (e) {
    return defaultValue;
  }
}
导出函数get(getter:()=>Target):Target |未定义;
导出函数get(getter:()=>Target,defaultValue:Target):Target;
导出函数get(getter:()=>any,defaultValue?:any):any{
试一试{
返回getter();
}捕获(e){
返回默认值;
}
}

不是类型安全的。请查看函数的实现。表达式被try/catch包围,因此在路径不存在的情况下不会出现异常。检查可选链接getter可能会失败,但不会在签名中反映它。IDK如何在Typescript中反映它;Haskell/Scala/Rust将使用
可能
选项
.9000,这只是实现的简化版本。真正的应用程序使用函数重载来捕获所有情况。
export function get<Target>(getter: () => Target): Target | undefined;
export function get<Target>(getter: () => Target, defaultValue: Target): Target;
export function get(getter: () => any, defaultValue?: any): any {
  try {
    return getter();
  } catch (e) {
    return defaultValue;
  }
}