簡體   English   中英

Typescript:function 當參數未定義或其類型已斷言時,返回類型不同

[英]Typescript: function return type is different when a parameter is undefined or its type is asserted

需求

代碼很簡單,但我的用例很復雜:

type MyFn = <B extends ['A']>(
  param?: B
) => B extends undefined ? 'TYPE_1' : 'TYPE_2'

// so that
const test1 = myFn() // shall be type TYPE_1
const test2 = myFn(['A']) // shall be type TYPE_2
  • 我希望如果param未定義,則類型為'TYPE_1'否則為'TYPE_2'
  • param應該是動態類型的,目標是 IDE 在將值寫入數組時自動完成/驗證值
  • function 中的param類型至少應為 (string[] | undefined)

我試過的

我嘗試了很多不同的配置都沒有成功: typescript playground

我實際上能得到的最接近的是這段代碼:

type MyFn = <
  T,
  B extends ['A']
>(
  param?: T | B
) => T extends string[] ? 'TYPE_2' : 'TYPE_1'

var a: MyFn3 = (param?) => (param ? 'TYPE_1' : 'TYPE_2') as any

const test1 = a() // IS type TYPE_1
const test2  = a(['A']) // IS be type TYPE_2

問題是 function 內部的推斷類型是any因為T沒有約束類型。 但是此時我們約束了T類型,返回類型中的條件總是返回 true。

有什么解決方案可以解決這個問題嗎?


真實世界的用例

這種類型背后的主要目標是定義一個字符串數組作為 object 的 props 地址,並返回該地址的值。
例如: ['level1', 'level2']將返回myObject.level1.level2

這是這個真實世界用例的簡化版本

您的B類型永遠不會undefined ,因為['A']永遠不會未定義。 編譯器可以有效地簡化你的表達式:

type MyFn = <B extends ['A']>(
  param?: B
) => B extends undefined ? 'TYPE_1' : 'TYPE_2'

type MyFn = <B extends ['A']>(
  param?: B
) => false ? 'TYPE_1' : 'TYPE_2'

type MyFn = <B extends ['A']>(
  param?: B
) => 'TYPE_2'

param是可選的B這一事實對B本身沒有影響。

你需要擴大B

type MyFn = <B extends ['A'] | undefined>(

產生正確的結果

const test1 = myFn(undefined) // TYPE_1

然后在省略時默認使其工作:

type MyFn = <B extends ['A'] | undefined = undefined>(

產生正確的結果

const test1 = myFn() // TYPE_1

暫無
暫無

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

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