[英]Function chaining in TypeScript with Omit types
假設我想在TypeScript中實現一個類型化的函數鏈,但在這種情況下,調用一個函數會從返回類型中刪除該函數。 例如:
type Omit<T, K> = Pick<T, Exclude<keyof T, K>>;
interface Chainable {
execute: () => Promise<void>;
}
interface Chain1 extends Chainable {
chain1?: () => Omit<this, 'chain1'>;
}
interface Chain2 extends Chainable {
chain2?: () => Omit<this, 'chain2'>;
}
let chain: Chain1 & Chain2 = {
execute: () => null,
chain1: () => {
delete chain.chain1;
return chain;
},
chain2: () => {
delete chain.chain2;
return chain;
}
};
chain.chain1().chain2().execute(); // Using the function chain
當我調用chain.chain1()
,我會得到Pick<Chain1 & Chain2, "execute" | "chain2"
Pick<Chain1 & Chain2, "execute" | "chain2"
作為返回類型,這很棒,因為它阻止我兩次調用chain1
。
但是,只要我用chain2
函數鏈接它,返回類型就變成Pick<Chain1 & Chain2, "chain1" | "execute"
Pick<Chain1 & Chain2, "chain1" | "execute"
。 這將允許我再次調用chain1
,這正是我想要阻止的。 理想情況下,編譯器會抱怨Property 'chain1' does not exist on type
:
chain.chain1().chain2().chain1(); // I want this to return a compiler error :(
我是以正確的方式來做這件事的嗎? TypeScript中是否可以逐步將多個Omit類型組合在一起,以便返回類型不斷省略屬性?
我認為對於類型this
時候首先檢查功能,在任何時候再重新評估,不后確定。 所以, this
對於第二次調用chain2
仍將是原來this
不是返回類型chain1
。 我不確定這是預期的行為還是錯誤,您可能需要檢查GitHub是否存在類似問題。
一種解決方法是使用泛型類型參數為任何給定函數捕獲this
函數,該參數將與this
。 這將確保通過功能鏈的正確類型流。 一個小問題是,分型則使用箭頭功能將無法正常工作了,你將需要使用常規的功能和訪問this
:
type Omit<T, K> = Pick<T, Exclude<keyof T, K>>;
interface Chainable {
execute: () => Promise<void>;
}
interface Chain1 extends Chainable {
chain1?: <T extends Chain1>(this: T) => Omit<T, 'chain1'>;
}
interface Chain2 extends Chainable {
chain2?: <T extends Chain2>(this: T) => Omit<T, 'chain2'>;
}
let chain: Chain1 & Chain2 = {
execute: () => null,
chain1: function () {
delete this.chain1;
return this;
},
chain2: function () {
delete this.chain2;
return this;
}
};
chain.chain1().chain2().execute(); // Using the function chain
chain.chain1().chain2().chain1().execute(); // error
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.