當我對復雜物件使用 in 進行型別縮小時,我偶然發現了 Typescript 中的問題,除非我首先提取它的代理變數,否則它不會正確縮小型別。
type Animal = {
fish: Fish;
bird: Bird;
};
type Fish = {
swim: () => void
};
type Bird = {
fly: () => void
};
const globalA: Animal = {} as unknown as Animal;
function useDirectly(typew: keyof Animal) {
if ("swim" in globalA[typew]) {
return globalA[typew].swim();
}
return globalA[typew].fly();
}
function useProxyVariable(typew: keyof Animal) {
const temp = globalA[typew];
if ("swim" in temp) {
return temp.swim();
}
return temp.fly();
}
TS Playground示例
有誰知道為什么會發生這種情況,以及是否有辦法在不使用這些代理物件的情況下進行型別縮小?
uj5u.com熱心網友回復:
有誰知道為什么會發生這種情況,以及是否有辦法在不使用這些代理物件的情況下進行型別縮小?
這只是 TypeScript 編譯器的一個限制,它縮小了變數的型別,而不是運算式。globalA[typew]是一個運算式。要縮小這樣的運算式,它不僅要跟蹤 ,globalA還要跟蹤typew。雖然我們很容易看到它們在保護和用法之間都沒有改變,但這只是編譯器的幾個實用限制之一。
如您所見,使用臨時變數/常量是您繞過它的方法(并且無需重新鍵入運算式)。
旁注:我不會使用術語“代理變數”(因為代理);它只是一個變數(好吧,在你的temp情況下是一個常量??)。
uj5u.com熱心網友回復:
from 回傳的型別globalA[typew]取決于兩個變數,globalA和typew.
您在問在進行型別縮小時是否可以添加額外的間接級別。編譯器不支持這一點是很合理的。
程式員可以試圖通過改變間接涉及的變數來欺騙它。
function useDirectly(typew: keyof Animal) {
if ("swim" in globalA[typew]) {
typew = 'bird';
return globalA[typew].swim(); // HAHA take that compiler I tricked you!
} else {
return v.fly();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/330855.html
標籤:打字稿
上一篇:根據它的道具確定型別
下一篇:僅覆寫一些通用變數
