Pesquisa de site

Como eu faria o equivalente ao dynamic cast em C++ no TypeScript?


Em C++ existe o dynamic cast que verifica em tempo de execução se um objeto implementa uma interface e retorna um nullptr ao invés do objeto se ele não implementar.

Como eu posso fazer a mesma coisa em TypeScript. A maneira que consigo pensar é verificar a existência e o tipo de cada propriedade:

interface MyInterface {
    value: string;
    lastUpdated: number;
    deleted: boolean;
}

let obj = JSON.parse(inputdata);

if ('value' in obj && 'lastUpdated' in obj && 'deleted' in obj && typeof obj.value === 'string' && obj.lastUpdated === 'number' && obj.deleted === 'boolean') {
    // do something
} else {
    // null case
}

Como as interfaces do TypeScript não estão disponíveis em tempo de execução, eu nem consigo escrever funções auxiliares para generalizar essas verificações.

Existe uma maneira melhor de fazer casts dinâmicos em TypeScript?

Resposta #1

Acredito que você consiga o que está pedindo se implementar um guardião de tipo

interface MyInterface {
    value: string;
    lastUpdated: number;
    deleted: boolean;
}

function isMyInterface(obj: any): obj is MyInterface {
  // You don't really need the first three, just the last three
  return 'value' in obj &&
         'lastUpdated' in obj &&
         'deleted' in obj &&
         typeof obj.value === 'string' &&
         typeof obj.lastUpdated === 'number' &&
         typeof obj.deleted === 'boolean';
}

let obj = JSON.parse(inputdata);

if (isMyInterface(obj)) {
    // do something, compiler knows obj is a MyInterface in this block
} else {
    // null case
}

Artigos relacionados