TypeScript wymuszanie typu

0
getSum(): Observable<number> {
   ...
  }

Jeśli nie podam typu dla Observable Intelisense mówi mi że jest wymagany. Jak napisać generyk który wymaga podania typu?
Potrafię napisać coś takiego

class List<T> {
  add(value: T): T {
    console.log(value);
    return value;
  }
}

ale tutaj jak nie podam typu to errora nie będzie....
czyli mogę zrobić tak:

const x = new List<number>();

albo tak:

const x = new List();
1

Masz na myśli coś takiego?

function foobar<T>(value: T): Promise<T> {
    return Promise.resolve(value);
}

const x = foobar(5);

Tutaj x będzie typu Promise<number>.

0
iksde napisał(a):

Masz na myśli coś takiego?

function foobar<T>(value: T): Promise<T> {
    return Promise.resolve(value);
}

const x = foobar(5);

Tutaj x będzie typu Promise<number>.

Nie, bo u Ciebie nie wymaga podania typu (intellisense nie podkreśla błędu jak wywołasz funkcję bez podania typu). A w moim przykładzie z Observable jak nie podam typu to podkreśla mi na czerwono i podaje taki komunikat:

(alias) class Observable<T>
import Observable
A representation of any set of values over any amount of time. This is the most basic building block of RxJS.

@class — Observable<T>

Generic type 'Observable<T>' requires 1 type argument(s).ts(2314)

0

ale tutaj jak nie podam typu to errora nie będzie....

W podanym przykładzie określiłeś typ bardzo klarownie: T.

Jak napisać generyk który wymaga podania typu?

Dlaczego chciałbyś coś takiego stworzyć?
Nie wiesz, jakiego typu jest rezultat Twojego getSum()?

0

Bo TypeScript jest na tyle mądry, że sam wywnioskuje, jaki typ powinien być w <>. W przypadku funkcji nie ma sensu forsowanie podania typu w <>, bo wszystkie możliwe informacje masz na wejściu. W przypadku klasy jest inaczej, bo z samego konstruktora nie zawsze jest wiadomo, jaki typ będzie pod spodem. Zobacz:

interface A { }
class B implements A { }
class C implements A { }

function foobar<T>(value: T): Promise<T> {
    return Promise.resolve(value);
}

const x = foobar(new B());
const y = foobar<A>(new C());

tutaj x jest typu Promise<B>, natomiast y - Promise<A>.

0

Jak napisać generyk który wymaga podania typu?

Dlaczego chciałbyś coś takiego stworzyć?
Nie wiesz, jakiego typu jest rezultat Twojego getSum()?

nie chodzi o to dlaczego tylko jak :)

0
iksde napisał(a):

Bo TypeScript jest na tyle mądry, że sam wywnioskuje, jaki typ powinien być w <>. W przypadku funkcji nie ma sensu forsowanie podania typu w <>,

Nie pytam o to czy jest sens tylko jak forsować podanie typu :)
Czysta ciekawość, bo Observable to robi, chcę wiedzieć jak ;)

0

Czysta ciekawość, bo Observable to robi, chcę wiedzieć jak

Observable robi co? :-P

0
Patryk27 napisał(a):

Czysta ciekawość, bo Observable to robi, chcę wiedzieć jak

Observable robi co? :-P

wymusza podanie typu

1
class MyObservable<T> {
}

Voilà :-)

0
Patryk27 napisał(a):
class MyObservable<T> {
}

Voilà :-)

wybacz ale to nie jest odpowiedź na moje pytanie. ide na stackoverflow :P

0

Daj znać jak dostaniesz odpowiedź, bo moim zdaniem nie da się :P

0

tak, Patryk 27 odpowiedział na pytanie, dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1