Pesquisa de site

typeguards - TypeScript: Guarda de Tipo para tipo personalizado


Objetivo: Tentando criar um guardião de tipo para um tipo personalizado.

Aqui está meu tipo personalizado:

type AppProviders =  'box' | 'dropbox' | 'google';

Esta é a minha primeira tentativa de criar um type guard, mas isso parece redundante ao declarar os valores permitidos duas vezes:

type AppProviders =  'box' | 'dropbox' | 'google';
const appProviders: AppProviders[] = [ 'box', 'dropbox', 'google' ];

function isAppProviders(provider): provider is AppProviders {
    return appProviders.includes(provider)
}

Existe uma maneira melhor de fazer uma verificação de tipo para tipos literais personalizados?

Obrigado

Resposta #1

A razão pela qual você está recebendo esse erro é porque:

https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-aliases

type Easing="ease-in" | "ease-out" | "ease-in-out";
Os tipos literais de string permitem que você especifique o valor exato que uma string deve ter. Na prática, os tipos literais de string combinam bem com tipos de união, guardas de tipos e aliases de tipo. Você pode usar esses recursos juntos para obter um comportamento semelhante ao de enum com strings.

Eu tive que pesquisar isso.... o exemplo que encontrei foi https://www.damirscorner.com/blog/posts/20200619-StringLiteralTypeGuardInTypescript.html

export const APP_PROVIDERS = ['a', 'b'] as const;
export type AppProviders = typeof APP_PROVIDERS[number];

export function isAppProviders(unknownString: string): unknownString is AppProviders {
  return (APP_PROVIDERS as unknown as string[]).includes(unknownString);
}