簡體   English   中英

使用Omit類型在TypeScript中進行函數鏈接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM