TypeScript - есть ли установленный способ выдачи ошибки при задании null / undefined? - PullRequest
0 голосов
/ 14 июля 2020

Я пишу код на 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();

В качестве альтернативы, если кто-нибудь знает более простой способ преобразовать нетипизированный объект в класс, я все уши.

1 Ответ

0 голосов
/ 14 июля 2020

Самый универсальный способ, с которым я столкнулся, - это определение функции защиты типа . Например (TypeScript Playground:

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);
}

Это дает вам три преимущества:

  1. Удобно, если у вас есть объединения, такие как AuthenticatedUser | GuestUser, у вас уже есть функция, чтобы определить, какая из них is.
  2. Использование TypeError дает JS точно такую ​​же ошибку с нулевыми зависимостями.
  3. Это также дает вам функции для создания Users из других источников с минимальными изменениями
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...