Hejto.pl
Dodaj post

Wpisz coś do wyszukania (minimum 2 znaki)

Wpis użytkownika Klopsztanga w Hydepark

Gruba ryba

w Hydepark

1piorunów

Kude xD Mam problem w TypeScript xD

Da się zrobić interfejs dla tego obiektu?
https://pastebin.com/hZvaA6Sx

DOCZYTAJ DO KOŃCA:
Chodzi o to by ten interfejs walidował stringi w indexes na podstawie kluczy w schema? Chodzi o to, by w kolumnie indexes nie było innych wartosci niż klucze obiektu z sasiedniego obiektu schema.

Dane wlatują w funkcję, i nie wiem jakie kolumny będą z poziomu programisty. Więc wszelakie
index: 'id | 'server_id'

odpada, bo nie wiem czy to bedzie id czy d⁎⁎a_id, czy server_id czy ujwieco_id

Chce to zrobic automatycznie,, by typescript sam to ogarnął poprzez kolumne schema

Komentarze (15)

Osobistość1piorunów

@Klopsztanga Nie wiem, czy dobrze rozumiem problem. Typescript działa tylko statycznie, na etapie kompilacji - jeśli dopiero w runtime dowiadujesz się, co dostałeś, to TS tego nie ogarnie, bo już go tam nie ma.

Gruba ryba0piorunów

@motokate chodzi mi o walidacje typów w trakcie kompilacji/pisania kodu.

Gruba ryba0piorunów

Za pomocą funkcji jakoś mi się udaje dobrze to typować... hmm

Gruba ryba0piorunów

A dobra, doczytałem do końca pytanie, to musisz dodac jeszcze string literał union type
type Indexes = "id" | "parent_id" itd

Gruba ryba0piorunów

@Klopsztanga to zostaje walidacja przez kod

Gruba ryba0piorunów

@def no i właśnie to jest dupa, bo ten schemat wchodzi w konstruktorze, więc nie wiem jaki schemat będzie :smiley:

GURU5piorunów

export interface someExamples {
servers: {
schema: {
id: string;
parent_id: string;
server_id: string;
name: string;
};
indexes: string[];
};
synchronization: {
schema: {
sync_id: string;
server_id: string;
some_field: string;
};
indexes: string[];
};
}

Oczywiście, musisz sobie sam poustawiać gdzie "?" , itp.

GURU5piorunów

@Klopsztanga Tak jak @def wspomniał poniżej, dajesz union. Takie na wpół enumeratywne działanie ma jednak wady.

Ponadto, pamiętaj że TS nie jest runtime. Więc walidacja typem z zasady nie zadziała (z wyjątkami)

Gruba ryba0piorunów

@ataxbras no nie zadziała.... Jak powyżej. Jak typescript ma wiedziec jakie wartosci powinny byc w indexes? Typujesz na stringa, więc wszystko tam mogę wpierdolić, każdy string

Gruba ryba1piorunów

Masz, chat gpt, sobie zmień, żeby to lepiej wygladało
```
interface ServerSchema {
 id: string;
 parent_id: string;
 server_id: string;
 name: string;
}

interface SynchronizationSchema {
 sync_id: string;
 server_id: string;
 some_field: string;
}

interface ExampleObject {
 servers: {
  schema: ServerSchema;
  indexes: string[];
 };
 synchronization: {
  schema: SynchronizationSchema;
  indexes: string[];
 };
}

// Usage example:
const someExamples: ExampleObject = {
 servers: {
  schema: {
   id: '',
   parent_id: '',
   server_id: '',
   name: '',
  },
  indexes: ['id', 'parent_id', 'server_id', 'asd'],
 },
 synchronization: {
  schema: {
   sync_id: '',
   server_id: '',
   some_field: '',
  },
  indexes: ['server_id', 'sync_id'],
 },
};
```

Gruba ryba0piorunów

@def no nie działa. Nie ma prawa działać. Takie podstawy to ogarniam, chodzi o coś bardziej skomplikowanego, by typ indexes był dynamiczny na podstawie schema, by zapobiec tworzenia indexu który nie istnieje :smiley:

Gruba ryba0piorunów

da się, nawet łatwo

Autorytet0piorunów

@Klopsztanga Ja tam w TypeScripta nie umiem, ale pierwsze co mi przyszło do głowy, to chatgpt : P

Gruba ryba0piorunów

@Fausto no chatgpt się wykłada xD