我有一個簡單的功能如下:
const transform = ([a, b]) => ({operation: a, ...b});
如何鍵入此函式以確保回傳型別是包含具有operation引數 a 型別和 b 屬性的鍵的物件。
我嘗試了以下但沒有成功:
function transform<[A, B]>(param: [A, B]): { operation: A } & B {
return { operation: param[0], ...param[1] };
}
有什么幫助嗎?謝謝!
uj5u.com熱心網友回復:
你有什么相當于一個印刷錯誤;而不是transform<[A, B]>(...),你需要這樣寫transform<A, B>(...):
function transform<A, B>(param: [A, B]): { operation: A } & B {
// ----> ^^^^^^ ^ ^ <------------> ^ ^
// declaring type params using the type params
//
return { operation: param[0], ...param[1] };
}
該transform()函式在兩個型別引數中是泛型的,和。(您可以將這些幾乎視為常規函式引數,但它們不是對應于呼叫者作為values傳入的引數,而是呼叫者作為types傳入的引數。)宣告泛型函式采用的型別引數串列的語法是將這些引數的逗號分隔串列放在尖括號內,緊挨在括號中的常規引數串列之前。 AB
只是在函式簽名和實作的后期才使用型別引數作為型別。所以param函式引數被注釋為 type [A, B],一個元組型別,其中第一個元素是 type A,第二個元素是 type B。您將要使用該型別的事實與宣告型別引數[A, B]的語法無關。
這就是所問問題的答案。
我可以更進一步,建議將您的原始transformJavaScript 代碼更直接地轉換為 TypeScript,如下所示:
const transform = <A, B extends object>(
[a, b]: [A, B]
): { operation: A } & B => ({ operation: a, ...b });
在這里您可以看到,即使箭頭函式也可以是通用的,因此需要在引數串列之前宣告型別引數(必須在括號中,即使您的箭頭函式看起來像x => x......你不能寫<T>x:T => x,你需要<T>(x: T) => x)。還可以看到箭頭函式的回傳型別注釋緊跟在帶有冒號的引數串列之后,并且在箭頭之前=>。
由于您將在which of type上使用object spread,因此告訴編譯器應該限制type是很有用的,這樣沒有人會呼叫并且可能會被輸出的內容弄糊涂。bBBobjecttransform([1, 2])
此外,您仍然可以在函式引數中使用解構賦值,因此我們([a, b]: [A, B])使用(param: [A, B]).
Playground 代碼鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/418765.html
標籤:
下一篇:將陣列溢位成對
