Daktilo el kitabının şu anda ok işlevleri hakkında hiçbir şey yok. Normal işlevler genel olarak bu sözdizimi ile yazılabilir: örnek:
function identity<T>(arg: T): T {
return arg;
}
Ok işlevleri için sözdizimi nedir?
Daktilo el kitabının şu anda ok işlevleri hakkında hiçbir şey yok. Normal işlevler genel olarak bu sözdizimi ile yazılabilir: örnek:
function identity<T>(arg: T): T {
return arg;
}
Ok işlevleri için sözdizimi nedir?
Yanıtlar:
Robin'in referans aldığı sözdizimini açıklayan tam örnek ... benim için eve getirdi:
Aşağıdaki gibi bir şey iyi çalışıyor:
function foo<T>(x: T): T { return x; }
Ancak bir ok genel işlevi kullanıldığında:
const foo = <T>(x: T) => x; // ERROR : unclosed `T` tag
Geçici çözüm: Derleyiciye genel olduğunu göstermek için generic parametresindeki uzantıları kullanın, örneğin:
const foo = <T extends unknown>(x: T) => x;
GenericFun<T, A=T>içeren bir kümeyi tanımlar . Bununla birlikte, genel türlerin doğrudan bir tür ek açıklama oluşturmasına izin vermek - örn. Const - ancak, örneğin veya GenericFun<number>GenericFun<string>const foo: GenericFunconst foo: GenericFun<string>const foo: GenericFun<number>
.tsxdosyadaki bir hatadır (TypeScript + JSX). Bir .tsdosyada, TypeScript oyun alanında gördüğünüz gibi iyi çalışıyor .
const foo = <T,>(x: T) => x;dizgi derleyicileri de JSX belirsizliğini azaltmak için sondaki virgülleri destekler .
Yukarıdaki örneği kafa karıştırıcı buldum. React ve JSX kullanıyorum, bu yüzden senaryoyu karmaşık hale getiriyor.
Ok jeneriklerini belirten TypeScript Deep Dive'dan açıklama aldım :
Geçici çözüm: Derleyiciye genel olduğunu göstermek için generic parametresinde uzantıları kullanın, bu bana yardımcı olan daha basit bir örnekten geldi.
const identity = < T extends {} >(arg: T): T => { return arg; }
Bir .tsxdosyadaysanız yazamazsınız <T>, ancak bu işe yarar:
const foo = <T, >(x: T) => x;
Saldırının aksine extends {}, bu saldırı en azından niyetini korur.
const foo = <T = any,>(x: T) => xçalışmıyor ...
Dil belirtimi p.64f'de yazıyor
<T> (...) => {...} formunun bir yapısı, bir tür parametresiyle bir ok işlevi ifadesi veya tür parametresiz bir ok işlevine uygulanan bir tür iddiası olarak ayrıştırılabilir. Eski gibi çözülür [..]
misal:
// helper function needed because Backbone-couchdb's sync does not return a jqxhr
let fetched = <
R extends Backbone.Collection<any> >(c:R) => {
return new Promise(function (fulfill, reject) {
c.fetch({reset: true, success: fulfill, error: reject})
});
};
Bu benim için çalışıyor
const Generic = <T> (value: T) => {
return value;
}
.tsbu işleri dosya. Aksi takdirde uzatmak gerekir.
popüler cevap extends {}işe yarıyor ve daha iyi extends anyolsa Tda, nesneyi
const foo = <T extends {}>(x: T) => x;
Bundan kaçınmak ve tip güvenliğini korumak için extends unknownbunun yerine
const foo = <T extends unknown>(x: T) => x;
çok geç, ama ES6 ile gerek yok benim için hala çalışır .... :)
let getArray = <T>(items: T[]): T[] => {
return new Array<T>().concat(items)
}
let myNumArr = getArray<number>([100, 200, 300]);
let myStrArr = getArray<string>(["Hello", "World"]);
myNumArr.push(1)
console.log(myNumArr)
<T, >. @jbmilgrom 'cevabı altında @Thomas yorumunda açıklandığı gibi
Bu tür bir beyanı kullanmak için:
const identity: { <T>(arg: T): T } = (arg) => arg;
İhtiyacınız olursa, işlevinize ek desteklerin tanımlanmasına izin verir ve bazı durumlarda işlev gövdesini genel tanımdan daha temiz tutmaya yardımcı olur.
Ek desteklere (ad alanı bir şey) ihtiyacınız yoksa, basitleştirilebilir:
const identity: <T>(arg: T) => T = (arg) => arg;
const foo? yanitype GenericFun<T, A=T> = (payload: A) => T;o zamanconst foo: GenericFunbirTtür sağlamadan hala genel yapmak ?