Przekazanie w parametrze właściwości interfejsu

Przekazanie w parametrze właściwości interfejsu
D7
  • Rejestracja:ponad 6 lat
  • Ostatnio:około rok
  • Postów:89
0

Cześć :D

Mam takie zagadnienie - mianowicie mam interfejs i metodę:

Kopiuj
interface ISomeInterface{
  prop1?: string;
  prop2?: number;
}

function foo<T>(interfaceProp: string){
}

Interfejs nie wyróżnia się niczym szczególnym, jedyne co to ma wszystkie właściwości nullowalne. Natomiast funkcja powinna przyjmować w parametrze interfaceProp WYŁĄCZNIE stringi, które odpowiadają nazwom właściwości interfejsu, którego typ przekazujemy w T. Wydaje się, że to żaden rocket science ale odbiłem się od zadania. Kombinowałem coś z mapped types (https://www.typescriptlang.org/docs/handbook/2/mapped-types.html) ale jedyne co mi się udało zrobić to taki parametr:

Kopiuj
function foo<T>(interfaceProp: {[Property in keyof T]}){
}

ale to przyjmuje obiekt w parametrze i nie rozwiązuje mojego problemu. Zależy mi na tym, by był to string i żeby intellisense podpowiadał wartości - zmieni się model i chcę żeby kompilacja się nie powiodła jak stringiem będzie coś co nie jest nazwą właściwości interfejsu.

Strasznie się na tym zaciąłem i za wszelkie uwagi serdecznie dzięki :D

Pozdrawiam,
Dawid.

edytowany 2x, ostatnio: Riddle
Xarviel
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 12 godzin
  • Postów:847
3

Natomiast funkcja powinna przyjmować w parametrze interfaceProp WYŁĄCZNIE stringi, które odpowiadają nazwom właściwości interfejsu, którego typ przekazujemy w T.

Kopiuj
function foo<T>(interfaceProp: keyof T) {
  //
}

foo<ISomeInterface>('prop1')

Można także uzyskać podobny efekt, ale bezpośrednio z obiektu

Kopiuj
const example = {
  prop1: 'hello',
  prop2: 4,
};

foo<typeof example>('prop1');
edytowany 1x, ostatnio: Xarviel
D7
  • Rejestracja:ponad 6 lat
  • Ostatnio:około rok
  • Postów:89
0

Super, dzięki! Za bardzo zafiksowałem się na stringu i nie wpadłem na tego keyofa w tej formie.

dzek69
Moderator
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Rzeszów
0

Interfejs nie wyróżnia się niczym szczególnym, jedyne co to ma wszystkie właściwości nullowalne.

Nie jest to prawda. Właściwości są opcjonalne, a to nie znaczy "nullowalne". Oczywiście dopóki mówimy o strict mode, jedynym godnym człowieka.


D7
Okej, może za bardzo skróciłem myśl. Właściwość opcjonalna czyli 'prop?: number' może nie pojawić się w obiekcje ale jak się pojawi to musi mieć przypisaną wartość. Z kolei 'prop: number | null' musi wystąpić w obiekcie ale może pod tym kluczem wystąpić null.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.