javascript - Typescript conversia tipului argumentului funcției
Chiar acum, fac:
function fn(arg) {
const foo = arg as SomeType;
...
}
Există vreun mod de a face conversia de tip în argumentul funcției? Adică ceva de genul function fn(arg as SomeType)
Iată un exemplu:
Promise.race([
Promise.resolve(1),
new Promise((_, fail) => {
setTimeout(fail, 1000);
}),
])
.then((res: number) => {
...
});
Dar TS aruncă:
Argument of type '(res: number) => void' is not assignable to parameter of type '(value: unknown) => void | PromiseLike<void>'.
Types of parameters 'res' and 'value' are incompatible.
Type 'unknown' is not assignable to type 'number'
În schimb, trebuie să fac:
.then((temp) => {
const res: number = temp as number;
...
});
Răspuns #1
În exemplu, faci cursă între Promise<number> și Promise<unknown>, dacă știi că a doua promisiune eșuează întotdeauna (folosită pentru timeout-uri) o poți tasta ca Promise<never>.
Acest lucru ar asigura că nu puteți rezolva de fapt promisiunea, deoarece nu există nicio valoare posibilă pe care _ ar accepta-o.
Promise.race([
Promise.resolve(1),
new Promise<never>((_, fail) => {
setTimeout(fail, 1000);
}),
])
.then((res: number) => {
...
});
Răspuns #2
TypeScript nu are „conversie de tip” atât de mult cât are „afirmare de tip”, deoarece nu schimbă comportamentul la rulare, deloc. Nu există nicio modalitate de a „conversa” un tip într-un argument de funcție. Totuși, poți „afirma”/solicita asta atunci când dezvolți cu ceva de genul:
function fn(arg: SomeType) {
...
}
Mai multe informații:
Afirmările de tip sunt o modalitate de a spune compilatorului „ai încredere în mine, știu ce fac.” O afirmare de tip este ca o conversie de tip în alte limbaje, dar nu efectuează verificări speciale sau restructurări ale datelor. Nu are niciun impact la rulare și este folosită doar de compilator. TypeScript presupune că tu, programatorul, ai efectuat toate verificările speciale de care ai nevoie.
