簡體   English   中英

在 Typescript 中部分指定函數類型的類型?

[英]Partially specifying the type of a function type in Typescript?

我有一個用例,其中我有一堆必須滿足某些標准的函數,即:

  1. 每個函數必須正好有 2 個參數,即一個string和一個Array<K>
  2. 必須返回一個未指定類型的 Promise ,它必須由 TS 機器推斷,類型不能是unknownany等,因為它會覆蓋類型推斷

本質上,我正在尋找一些魔法類型,如:

type MagicType<K> = (str: string, keys: Array<K>) => Promise<infer>;

以便這些函數進行類型檢查:並返回推斷類型:

const f1: MagicType<number> = async (str, keys) => {
    return '42'
}
// expecting typeof f1 === (string, Array<number>) => Promise<string> 

const f2: MagicType<number> = async (str, keys) => {
    return keys.length;
}
// expecting typeof f2 === (string, Array<number>) => Promise<number> 

// note lack of `async` keyword
const f_error2: MagicType<number> = (str, keys) => {
    return keys.length;
}
// expecting to be a compilation error, since number is not Promise<unknown>

我的試驗和(僅)失敗可以在這里找到: TS-playground

任何幫助表示贊賞。 我知道這很可能是極端情況,但我想知道是否有可能。 非常感謝!

我看到兩個選項 og 處理這種情況:

  1. 您提供顯式返回類型:

const f1: MagicType<number, string> = async (str, keys) => '42'
  1. 提供額外的功能以推斷返回類型:

type MagicType<K> = (str: string, keys: Array<K>) => Promise<any>;

const infer = <Cb extends MagicType<number>>(cb: Cb) => cb


const infered = infer(async (str, keys) => '42')

const result = infered('hello', [1, 2, 3]) // Promise<string>

操場

請記住,一旦您為 in 中的函數提供了顯式類型MagicType<number>

const f1: MagicType<number> = async (str, keys) => {
    return '42'
}

TypeScript 不做任何推理工作,它只使用MagicType<number>

考慮這個例子:

const arr: ReadonlyArray<string> = ['a', 'b'] as const;

您可能認為 TS 能夠弄清楚除了ReadonlyArray<string> arr也是['a','b'] ,但事實並非如此。 數組arr只是一個ReadonlyArray<string>不再可能推斷數組元素的文字類型。

暫無
暫無

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

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