簡體   English   中英

打字稿從參數返回函數類型

[英]Typescript return type of function from parameter

我想知道如何在打字稿中執行以下操作:

如果我有這個功能:

function getQueries(query) {
  return Object.keys(query).reduce((list, key) => {
    return { ...list, [key]: query[key].length > 3  }
  }, {})
}

我想傳遞這樣的對象

getQueries({ first: 'dsds', second: 'dsdsds', third: 'ds' })

並且我想鍵入該函數以返回與我傳遞的完全相同的結構,但使用布爾值作為值。

const queries = getQueries({ first: 'dsds', second: 'dsdsds', third: 'ds' })
queries.first // ts error -> Property 'first' does not exist on type '{}'

我該如何處理這種打字?

您正在尋找泛型和映射類型:

function getQueries<T>(query: T): {[key in keyof T]: boolean} {
}

我的答案將更多針對您的具體情況,我需要稍微重構當前代碼以實現類型正確性。 考慮空閑代碼:

type BoolRecord<T extends Record<string, string>> = Record<keyof T, boolean> 
function getQueries<Q extends Record<string, string>>(query: Q): BoolRecord<Q> {
  return Object.keys(query).reduce((list, key) => {
    return { ...list, [key]: query[key as keyof Q].length > 3  }
  }, {} as BoolRecord<Q>)
}

const result = getQueries({ first: 'dsds', second: 'dsdsds', third: 'ds' });
// Record<"first" | "second" | "third", boolean>

我的假設是函數getQueries需要作為帶有字符串值的參數對象獲取,因為您在內部使用的是length屬性(實現檢查.length>3 )。 所以函數參數類型是Record<string, string> 下一步是定義返回類型,這是由BoolRecord完成的,該類型采用原始 Record 並根據需要創建相同但帶有 bool 字段的字段。

我使用了Record實用程序類型,但這也可以通過映射類型來實現(Record 實際上是映射類型)。

有趣的部分是BoolRecord它的定義說,對於任何 Record 給我 Record 使用相同的鍵(由keyof T完成),並以 bool 作為值類型。

我想知道如何在打字稿中進行以下操作:

如果我有此功能:

function getQueries(query) {
  return Object.keys(query).reduce((list, key) => {
    return { ...list, [key]: query[key].length > 3  }
  }, {})
}

我想在其中傳遞這樣的對象

getQueries({ first: 'dsds', second: 'dsdsds', third: 'ds' })

而且我想輸入該函數的類型以返回與我傳遞的結構完全相同的結構,但是將布爾值作為返回值。

const queries = getQueries({ first: 'dsds', second: 'dsdsds', third: 'ds' })
queries.first // ts error -> Property 'first' does not exist on type '{}'

我該如何進行這種打字?

暫無
暫無

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

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