摘要:中類型推導部分預期想實現的效果在中對應的類型是對應的類型是對應的類型是但是,我們想要實現的是轉換成小寫的所以我們寫個泛型來轉換預覽鏈接定義的類型留個泛型是給復雜類型做兼容復雜的類型定義函數接收的類型最關鍵的一步根據輸入的類型計算出來函
rfc 中類型推導部分 Type Inference預期想實現的效果
createComponent({ props: { foo: { type: String, required: true }, bar: { type: Number }, boo: Boolean, options: (null as any) as { msg: string }, requiredOptions: { type: (null as any) as { msg: string }, required: true } } as const, setup(props) { props.foo; // string props.bar; // number | undefined props.boo; // boolean | undefined props.options; // {msg: string } | undefined props.requiredOptions; // {msg: string } } });String -> string 、 Number -> number 、 Boolean -> boolean
在 ts 中
String對應的類型是StringConstructor
Number對應的類型是NumberConstructor
Boolean對應的類型是BooleanConstructor
但是,我們想要實現的是轉換成小寫的string | number | boolean
所以我們寫個泛型來轉換
type NormalizeType= T extends StringConstructor ? string : T extends NumberConstructor ? number : T extends BooleanConstructor ? boolean : T;
playground 預覽鏈接
定義 prop 的類型type BuiltInType= | StringConstructor | NumberConstructor | BooleanConstructor | T;
留個泛型是給復雜類型做兼容
rfc 復雜的 prop 類型
type DefaultType最關鍵的一步根據輸入的props類型計算出來setup函數接收的形參props類型= { [key: string]: | { type?: BuiltInType ; require?: boolean; } | BuiltInType ; };
type ReflexType組合出來createComponent函數定義= { [key in keyof T]: T[key] extends { type: infer TYPE; required: true } ? NormalizeType : T[key] extends { type: infer TYPE } ? NormalizeType | undefined : NormalizeType | undefined };
function createComponent完整代碼>(props: { props: T; setup(props: ReflexType ): any; }) {}
type BuiltInType= | StringConstructor | NumberConstructor | BooleanConstructor | T; type NormalizeType = T extends StringConstructor ? string : T extends NumberConstructor ? number : T extends BooleanConstructor ? boolean : T; type ReflexType = { [key in keyof T]: T[key] extends { type: infer TYPE; required: true } ? NormalizeType : T[key] extends { type: infer TYPE } ? NormalizeType | undefined : NormalizeType | undefined }; type DefaultType = { [key: string]: { type?: BuiltInType ; require?: boolean } | BuiltInType ; }; function createComponent >(props: { props: T; setup(props: ReflexType ): any; }) {} createComponent({ props: { foo: { type: String, required: true }, bar: { type: Number }, boo: Boolean, options: (null as any) as { msg: string }, requiredOptions: { type: (null as any) as { msg: string }, required: true } } as const, setup(props) { props.foo; props.bar; props.boo; props.options; props.requiredOptions; } });
playground 預覽鏈接
效果圖文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/104623.html
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:拿到的都是而不是原始值,且這個值會動態變化。精讀對于的與,筆者做一些對比。因此采取了作為優化方案只有當第二個依賴參數變化時才返回新引用。不需要使用等進行性能優化,所有性能優化都是自動的。前端精讀幫你篩選靠譜的內容。 1. 引言 Vue 3.0 的發布引起了軒然大波,讓我們解讀下它的 function api RFC 詳細了解一下 Vue 團隊是怎么想的吧! 首先官方回答了幾個最受關注的...
閱讀 511·2023-04-26 00:33
閱讀 3538·2021-11-24 09:39
閱讀 2897·2021-09-22 15:34
閱讀 2316·2019-08-23 18:07
閱讀 2912·2019-08-23 18:04
閱讀 3693·2019-08-23 16:06
閱讀 2893·2019-08-23 15:27
閱讀 1613·2019-08-23 14:32