我在玩泛型,遇到了我不太理解的代碼,我有一個接收 resp 物件的函式;它可以是 TSuccess 或 TFailure 型別,它們具有不同的結構,我想根據傳入的型別獲取回傳型別。為此,我使用了泛型。看起來代碼正在運行,但我仍然有波浪線和錯誤
“型別 '“成功”' 不可分配給型別 'T 擴展 TFailure ?“失敗”:T 擴展 TSuccess ?“成功”:從不'。(2322)”
我在 Stackblitz 上運行代碼,點擊跟隨到操場
我在這里做錯了嗎?
謝謝你的回答!????
type TSuccess = {
success: {
result: 'successful';
};
};
type TFailure = {
error: 'failed';
};
const handleResp = <T extends TSuccess | TFailure>(
resp: T
): T extends TFailure
? TFailure['error']
: T extends TSuccess
? TSuccess['success']['result']
: never => {
if ('success' in resp) {
if ('result' in resp.success) {
return resp.success.result;
}
} else {
return resp.error;
}
throw new Error('hahaa');
};
const r1 = handleResp<TSuccess>({ success: { result: 'successful' } });
// r1 = 'successful'
const r2 = handleResp<TFailure>({ error: 'failed' });
// r2 = 'failed'
uj5u.com熱心網友回復:
TypeScript 編譯器不理解具有泛型的條件型別如何對應于函式實作中的 return 陳述句。它只是看到條件以T extends ...它開始并停止推理。
您可以使用型別斷言告訴編譯器您知道型別是正確的。我會改用函式多載。我們可以將泛型型別與實際的函式實作分開。
function handleResp<T extends TSuccess | TFailure>(resp: T): T extends TFailure
? TFailure["error"]
: T extends TSuccess
? TSuccess["success"]["result"]
: never
function handleResp(
resp: TSuccess | TFailure
): TFailure["error"] | TSuccess["success"]["result"] {
if ("success" in resp) {
if ("result" in resp.success) {
return resp.success.result;
}
} else {
return resp.error;
}
throw new Error("hahaa");
};
操場
uj5u.com熱心網友回復:
我可能累了,但我看不出這段代碼有什么通用性。
在這個非常具體的用例中,由于每個變體的路徑不同,因此您的函式需要知道如何獲取每個變體的結果,因此從這個意義上說它不是通用的,并且由于每個變體的結果都是靜態字串,您也可以在多載中使用該字串,如下所示,那里也沒有通用的:
function handleResp(resp: TSuccess): "successful"
function handleResp(resp: TFailure): "failed"
function handleResp(resp: TSuccess | TFailure): "successful" | "failed" {
if ("success" in resp) {
if ("result" in resp.success) {
return resp.success.result;
} else {
throw new Error("missing result in response");
}
} else {
return resp.error;
}
};
我可能遺漏了一些東西,我并不是說你應該使用前一個,我只是感到困惑。
如果那個用例是真實的,我更喜歡我的嘗試而不是 Tobias 的嘗試,因為沒有涉及通用或條件,它不那么復雜;如果您的用例實際上不同,也許您可??以告訴我們更多資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/514941.html
下一篇:如何迭代模板文字聯合型別?
