簡體   English   中英

如何使用 TypeScript“keyof”創建通用 API 接口的接口?

[英]How to use TypeScript "keyof" to create interface to generic API interface?

我在使用 TypeScript 的類型系統時遇到問題 model 一個從 Lua 調用到 TypeScript 的通用接口。為此,開發人員必須定義一個 TypeScript 接口,定義 TypeScript 方法,8839969386988 可以調用該方法細節在這里並不重要,因為下面的簡單示例說明了我的困惑。

演示鍵

從上面的代碼中可以看出,我有“ApiInterface”,它定義了開發人員可能希望從 Lua 調用的任意方法。所有這些方法都采用第一個參數,即 object(類似於“this”),然后剩余的 arguments 可以是開發人員需要從 Lua 傳遞到 TypeScript 方法的任何內容。 實際上,這些剩余的 arguments 唯一支持的類型是數字、字符串、boolean、null 等原語。在上面的示例代碼中,我定義了 3 個這樣的 API 方法,但開發人員可以定義他們想要的任何方法。 這個 Lua-to-TypeScript 模塊的全部要點是通用的,而不是綁定到“ApiInterface”的任何特定定義。

運行時最終將 Lua-to-TypeScript 方法調用打包到 ApiCall 類型的 object 中,您可以看到它定義了方法名稱字段,JavaScript object 用於“this”,其余為任意 arguments。

為了說明我的困惑,我展示了一個 KeyofDemo 來說明我遇到的 TypeScript 錯誤。 KeyofDemo class 中有一個“運行”方法,它想要獲取 ApiCall object 並調用相應的 TypeScript/JavaScript function。

在這兩種情況下,您可以在方法的實際調用下看到紅色波浪線。 一種情況是沒有額外的 arguments(超出所需的“this”參數),另一種情況是 ApiCall.args 實際上填充了 arguments 的數組以從 Lua 傳遞到 TypeScript。

第一個紅色波浪形案例的錯誤消息是: A spread argument must either have a tuple type or be passed to a rest parameter

第二個紅色波浪形案例的錯誤消息是: Expected 3 arguments but got 1

這些錯誤消息對我來說都沒有任何意義。 如果我嘗試編譯上面的 TypeScript 代碼,編譯器會報告類似的錯誤。

model 如何讓 TypeScript 的類型系統達到我所描述的最佳行為? 現在,我通過將第 23 行和第 25 行的大小寫“this.api”更改為“any”來解決這個問題,這會關閉 TypeScript 編譯器。 但是我想知道如何正確解決model這個問題。

第一個錯誤是因為 Javascript/Typescript 不支持在參數中使用擴展運算符,除非你的 function 配置為這樣做。

您必須配置 function 以接受可變參數。

interface ApiInterface {
    apiMethod0(thisObj: Object, ...args: any[]): void
    apiMethod1(thisObj: Object, ...args: [string]): void
    apiMethod2(thisObj: Object, ...args: [number, boolean]): void
}

在操場上看到這段代碼

第二個錯誤是因為這些方法需要全部具有相同的“形狀”,或者具有相同的參數#。 在這種情況下,我們用同一塊石頭殺死兩只鳥。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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