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
