function say3<T>(a: T): T { 
    return a + 1; 
} 
let speak = say3<number>(1)

Próbowałem wersji demonstracyjnej, ale jest na niej napisane: „Wpisz „liczba” nie można przypisać do wpisania „T”. T nie jest liczbą?

2
SanGo Miscro 28 listopad 2018, 05:06

1 odpowiedź

Najlepsza odpowiedź

Problem tutaj dotyczy operacji + 1. Typescript nie może określić, czy robisz sumę liczb, konkatenację ciągów, czy nawet operację BigInt. W rzeczywistości, ponieważ wynik zmiennej typu T (gdzie T jest dowolnym możliwym typem) plus 1 nie jest dobrze zdefiniowany i może nawet zwrócić typ inny niż T! Konkretny przypadek, który przychodzi mi do głowy to []+1=="1" lub {}+1==1, przypadki, w których T to Array i Object, podczas gdy funkcja zwróci string lub odpowiednio number.

Kiedy tworzysz szablon funkcji, funkcja musi być dobrze zdefiniowana, niezależnie od możliwych typów T. Innymi słowy, tak T nie jest liczbą, nawet jeśli wyraźnie podasz liczbę później.

Możliwym rozwiązaniem byłoby jawne określenie, że typem zwracanym jest liczba i ograniczenie T:

function say3<T extends number>(a: T): number {
  return a + 1;
}
let speak = say3<number>(1)

Lub jeśli naprawdę chcesz, aby T pracował z innymi typami, możesz wykonać przeciążenie operatora:

function say3(a: string): string 
function say3(a: number): number
function say3(a: any[]): string
function say3(a: object): number
function say3(a: null): number
function say3(a: undefined): number
function say3(a: any) { 
    return a+1; 
} 
let speak = say3(1)

Tak czy inaczej, nie możesz wywołać operatora przez niezdefiniowany typ.

3
Badashi 28 listopad 2018, 05:49