【发布时间】:2022-01-18 17:13:04
【问题描述】:
我有一些代码,其中有几个函数需要对对象进行空值检查,然后对其进行处理,或者如果它为空值则抛出错误,如下所示:
interface SomeObject {
doThingOne: () => string;
doThingTwo: () => string;
}
let object: SomeObject | null;
function doThingOne() {
if(!object) {
throw new Error('Object is null!');
}
// Typescript knows that object is not null, so it's fine with accessing its properties/methods
return object.doThingOne();
}
function doThingTwo() {
if(!object) {
throw new Error('Object is null!');
}
return object.doThingTwo();
}
我想将空检查提取到一个函数中以减少重复代码,如下所示:
interface SomeObject {
doThingOne: () => string;
doThingTwo: () => string;
}
let object: SomeObject | null;
function requireObject() {
if(!object) {
throw new Error('Object is null!');
}
}
function doThingOne() {
requireObject();
// Typescript no longer knows that object is defined, so it gets mad at the next line
return object.doThingOne();
}
function doThingTwo() {
requireObject();
return object.doThingTwo();
}
但是,当我这样做时,打字稿不再知道检查后,object 肯定存在。有没有干净的方法来做到这一点?
This question 看起来很相似,但实际上并不能让我节省太多代码重复,因为我仍然需要设置 if
【问题讨论】:
-
这很令人困惑,我不完全确定你在问什么,doThingOne/doThingTwo 什么时候将对象扩展为方法?为什么要使用单独的功能?目标是什么?你能做一个最小的、可重复的例子吗? stackoverflow.com/help/minimal-reproducible-example
-
我只是想减少重复。
object,如果存在的话,它是一个有一些方法的类型。不管我是想打电话给object.doThingOne()还是使用object.someProperty,问题都是一样的。 -
这是一个代码示例,在首选方法上有错误:typescriptlang.org/play?#code/…
-
没有办法让像
requireObject()这样的函数调用影响任意范围内值的状态。您可以使用assertion function 来获得类似的结果,但您需要将受保护的东西作为参数传递,例如requireObject(object)。见here。如果这种方法满足您的需求,我可以写一个答案,否则答案基本上是“不,你不能这样做”,我想我可以写成答案,也许吧。告诉我。 -
@jcalz 断言函数似乎正是我正在寻找的!
标签: typescript types null