javascript - Ako napísať strážny typ hasOwnProperty v TypeScripte, ktorý akceptuje ľubovoľný vstup?


Toto je väčšinou len na to, aby som sa naučil, ako TS funguje. Tu sú 2 spôsoby, ako môžem napísať typovú stráž pre hasOwnProperty:

function hasOwnProperty<
  Obj extends Record<string, any>,
  Prop extends any,
>(
  obj: Obj,
  prop: Prop,
): prop is keyof Obj {
  return Object.prototype.hasOwnProperty.call(obj, prop as any);
}

Chyba: Typ 'keyof Obj' nie je možné priradiť k typu 'Prop'.

function hasOwnProperty<
  Obj extends Record<string, any>,
  Prop extends any,
>(
  obj: Obj,
  prop: Prop,
): obj is Obj & Record<Prop, any> {
  return Object.prototype.hasOwnProperty.call(obj, prop as any);
}

Chyba: Typ 'Prop' nespĺňa obmedzenie 'string | number | symbol'.

Ak chcem, aby prop bolo any, existuje spôsob, ako to funguje?

Odpoveď č. 1

Môžete definovať triedu (povedzme Test) a použiť ju týmto spôsobom prop je keyof Test

class Test{

}

function hasOwnProperty<
  Obj extends Record<string, any>,
  Prop extends any,
>(
  obj: Obj,
  prop: Prop,
): prop is keyof Test {
  return Object.prototype.hasOwnProperty.call(obj, prop as any);
}

PlaygroundLink