我想用我自己的泛型函式來包裝一個給定的泛型函式(該函式不在我的控制之下)。
例如:
type givenFunction= <T, V>(a: string, b: V) => Promise< T>。
// 這就是我想要的,盡管我想從`givenFunction`中推斷出所有的型別
type myFunction = <T, V>(b: V) => Promise<T>
另外,我想重復使用大部分給定函式的型別定義(使用Parameters和ReturnType)。它已經有點作用了,只是它不再是通用的了。
下面是我想做的真實世界的例子。TypeScript Playground
uj5u.com熱心網友回復:
你不能純粹地在型別級別上做這個。 如果你能接受一些運行時的影響,你可以制作一個高階函式,將一個通用函式轉換為另一個。 例如:
functionpassInitialString< A extends any[], R>(t: string, f: (t: string, ...r: A) => R) {
return (...r: A) => f(t,...r)。
}
這個函式將接收任何第一個引數為字串的函式f,并產生另一個不需要該引數的函式。 這里可能看起來沒有什么特別的事情發生,但是如果f恰好是通用的,那么回傳的函式也將是通用的。
讓我們用你的操場鏈接中graphql-request中的request函式作為一個例子:
import { request as gqlRequest } from 'graphql-request';
宣告 const endpoint: string;
const request = passInitialString(endpoint, gqlRequest)。
/*
const request: <T = any, V = Variables>(
檔案。RequestDocument,
variables? V | 未定義。
requestHeaders?: HeadersInit | undefined
) => Promise<T>
*/
request型別是通用的,并且正好有你想要的型別。
如果你不想要任何運行時效果,除了手動寫出所需的通用型別外,你能做的并不多。
TypeScript 沒有直接支持 更高的種型別別,即 microsoft/TypeScript#1213 中所要求的那種型別,也沒有 通用值,即 microsoft/TypeScript#17574,因此沒有辦法表達您在型別系統中進行的型別操作。
手動寫出型別是很煩人的,它不會自動更新原始的函式型別,而且你可能需要宣告很多其他型別:
手動寫出型別是很煩人的,它不會自動更新原始的函式型別。
export type Variables = { [key: string]: any }
export type RequestDocument = string | DocumentNode: string
型別 Request = <T = any, V = Variables> (
檔案。RequestDocument。
variables? V | 未定義。
requestHeaders?: HeadersInit | undefined
) => Promise<T>
所以希望你能接受像passInitialString()這樣的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/307926.html
標籤:
