在编写数据验证API时,我经常提供两个函数-一个函数返回boolean
,另一个函数引发。通常,抛出的返回类型为void
。
interface MyType {
numberField: number;
stringField: string;
}
function isMyType(o: any): o is MyType {
return typeof o === "object"
&& o !== null
&& typeof o.numberField === "number"
&& typeof o.stringField === "string";
}
function validateMyType(o: any): void {
if (!isMyType(o)) {
throw new Error("Invalid MyType object.")
}
}
我想做的是使用类型谓词,以便同一块(或任何子块)中的所有后续代码都可以采用对象的类型。
const input: any = ...;
validateMyType(input);
// here I would like TypeScript to understand that input is a MyType
我可以这样做吗?
答案 0 :(得分:2)
您可以使用TypeScript 3.7中的新断言函数来执行此操作。详细了解它们in the TypeScript handbook。
以您的示例为例,您可以将validate
函数的返回类型更改为asserts o is MyType
。这样会在validate
调用之后,将相同范围内的后续代码中的参数类型通知给类型系统。
答案 1 :(得分:0)
您正在寻找新的custom type assertion syntax
interface MyType {
numberField: number;
stringField: string;
}
function isValid(o: any): o is MyType {
return typeof o === "object"
&& o !== null
&& typeof o.numberField === "number"
&& typeof o.stringField === "string";
}
function validate(o: any): asserts o is MyType{
if (!isValid(o)) {
throw new Error("Invalid MyType object.")
}
}
declare var o: any;
validate(o)
o.numberField //ok
o.numberField2 //err