考慮這種型別
type Last<TProps> =
TProps extends [infer TProp]
? TProp
: TProps extends [infer TProp, ... infer Rest] & PropertyKey[]
? Last<Rest>
: never;
export type L0 = Last<['a']>; // 'a'
export type L1 = Last<['a', 'b']>; // 'b'
export type L2 = Last<['a', 'b', 'c']>; // 'c'
它按我的預期作業。但是如果我想限制泛型引數 - 它會失敗
type Last<TProps extends PropertyKey[]> =
TProps extends [infer TProp]
? TProp
: TProps extends [infer TProp, ... infer Rest]
? Last<Rest> // error. 'Rest' does not satisfy the constraint 'PropertyKey[]'
: never;
我嘗試使用 & - 它沒有給出錯誤,但輸出不是我所期望的
type Last<TProps extends PropertyKey[]> =
TProps extends [infer TProp]
? TProp
: TProps extends [infer TProp, ... infer Rest]
? Last<Rest & PropertyKey[]> // no error
: never;
export type L0 = Last<['a']>; // 'a'
export type L1 = Last<['a', 'b']>; // string | number | symbol
export type L2 = Last<['a', 'b', 'c']>; // never
我如何在條件型別中使用泛型型別約束來獲得這樣的輸出
type Last<TProps extends PropertyKey[]> = ????
export type L0 = Last<['a']>; // 'a'
export type L1 = Last<['a', 'b']>; // 'b'
export type L2 = Last<['a', 'b', 'c']>; // 'c'
PS我知道在這個例子中這個約束沒有多大意義,但它是我發現的最簡單的例子。
uj5u.com熱心網友回復:
您只需要檢查推斷Rest是否受額外型別的約束:
type Last<TProps extends PropertyKey[]> =
TProps extends [infer TProp]
? TProp
: TProps extends [infer TProp, ... infer Rest] & PropertyKey[]
? Rest extends PropertyKey[]
? Last<Rest>
: never
: never;
export type L0 = Last<['a']>;
export type L1 = Last<['a', 'b']>;
export type L2 = Last<['a', 'b', 'c']>;
TS游樂場
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/436901.html
