TypeScript-当给定null/未定义时,是否有既定的方法抛出错误?

TypeScript-当给定null/未定义时,是否有既定的方法抛出错误?,typescript,Typescript,我正在用TypeScript编写一些代码,通过将对象中的所有属性设置到类中,将一些非类型化对象(可能是某种JSON)转换为类型化类。如果该非类型化对象没有我在类中查找的属性,我想抛出一个错误 我在寻找一种简洁的方式来用TypeScript实现这一点,并提出了这个。据我所知,它是有效的,但对我来说,它感觉有点不舒服。我想知道其他开发人员是否知道这样做的既定方法,或者这是否是一种好方法 const invalid = () => {throw new Error("Invalid i

我正在用TypeScript编写一些代码,通过将对象中的所有属性设置到类中,将一些非类型化对象(可能是某种JSON)转换为类型化类。如果该非类型化对象没有我在类中查找的属性,我想抛出一个错误

我在寻找一种简洁的方式来用TypeScript实现这一点,并提出了这个。据我所知,它是有效的,但对我来说,它感觉有点不舒服。我想知道其他开发人员是否知道这样做的既定方法,或者这是否是一种好方法

const invalid = () => {throw new Error("Invalid input given in User.")}
this.firstName = obj.firstName ?? invalid();
this.lastName = obj.lastName ?? invalid();
this.email = obj.email ?? invalid();

或者,如果有人知道将非类型化对象转换为类的更简单的方法,我洗耳恭听。

我遇到的最通用的方法是定义一个类。 例如(TypeScript):

interface IUser {
    firstName: string;
    lastName: string;
    email: string;
}

function isIUser(potentialIUser: any): potentialIUser is IUser {
    return "firstName" in potentialIUser && "firstName" in potentialIUser && "firstName" in potentialIUser;
}

class User implements IUser {
    public firstName: string;
    public lastName: string;
    public email: string;

    constructor(user: IUser) {
        if(!isIUser(user)){
            throw new TypeError("Provided user is not compatible with interface IUser");
        }
        this.firstName = user.firstName;
        this.lastName = user.lastName;
        this.email = user.email;
    }
}

async function whoAmI(): Promise<User> {
    const user: IUser = await (await fetch("example.com/api/user/me")).json();
    return new User(user);
}
接口IUser{
名字:字符串;
lastName:string;
电子邮件:字符串;
}
函数IsUser(PotentialUser:any):PotentialUser是IUser{
在PotentialUser中返回“firstName”&&PotentialUser中返回“firstName”&&PotentialUser中返回“firstName”;
}
类用户实现IUser{
public firstName:string;
公共姓氏:字符串;
公共电子邮件:字符串;
构造函数(用户:IUser){
如果(!isIUser(user)){
抛出新类型错误(“提供的用户与接口IUser不兼容”);
}
this.firstName=user.firstName;
this.lastName=user.lastName;
this.email=user.email;
}
}
异步函数whoAmI():Promise{
const user:IUser=await(await-fetch(“example.com/api/user/me”)).json();
返回新用户(用户);
}
这给了您三个优势:

  • 方便的是,如果您有像
    AuthenticatedUser | GuestUser
    这样的联合,那么您已经有了一个函数来确定它是哪个
  • 使用
    TypeError
    会给JS带来完全相同的错误,没有依赖关系
  • 这还为您提供了从其他源构建
    用户
    的函数,只需进行最小的更改

  • 这看起来像是运行时类型检查的一个特例。你有没有研究过这样的库,它会为你提供类型保护?我的意思是,
    null
    /
    未定义的
    是唯一可能的问题吗?如果你的属性应该是
    字符串
    ,但在JSON中它是一个
    数字
    ?谢谢你的库--我会的仔细想想。我认为我获取JSON的地方应该是名称/电子邮件应该是字符串的地方,但是你是对的,在其他情况下也可以简单地抛出一个错误。谢谢你写出示例代码!我确实在TypeScript的文档中看到了类似的东西,但我不这么认为<代码>“属性”在对象中函数在TypeScript中检查属性是否填充了空值——只是对象中是否存在属性。幸运的是,上面的注释提到了一个库来执行这种检查。