tengo un metodo asi
square(num: number | string): number { // }En este método, quiero verificar el tipo de datos del parámetro e invocar la lógica en consecuencia. ¿Cómo hacer eso en TS?
Editar:
Tipos específicos en cuestión
export type KV<T extends string | number> = { key: string; val: T; } export type LogicalKV<T extends string | number> = { logicalOperator: LogicalOperator filters?: Filter<T>[]; logicalFilters?: LogicalFilter<T>[]; }Función
class Foo { read(filter: KV<string | number> | LogicalKV <string | number>): Promise<void> { // if filter is of KV do this, else do that } }Desafortunadamente, los tipos se eliminan en tiempo de ejecución. Pero podrías seguir el buen camino antiguo de typeof
if (typeof num === "string") {/*it's string here*/} else {/*it's number here*/}Typescript también entenderá eso y forzará a un tipo apropiado en cada rama.
En el caso de tipos personalizados, como el suyo, será un poco diferente. Los tipos de datos algebraicos están involucrados. Tampoco es demasiado bonito cuando lo instancias, pero tienes que lidiar con pasar "tipos" de cadenas en tiempo de ejecución de una forma u otra.
export type KV = { kvField: string; kind: "kv"; }; export type LogicalKV = { logicalKvField: number; kind: "logicalKv"; }; const KVInstance: KV = { kind: "kv", kvField: "foo" }; const LogicalKVInstance: LogicalKV = { kind: "logicalKv", logicalKvField: 1 }; type FilterArg = KV | LogicalKV; const fn = (f: FilterArg) => { switch (f.kind) { case "kv": // ts knows it's KV f.kvField; return; case "logicalKv": // ts knows it's LogicalKV f.logicalKvField; return; } }