摘要:中類型推導(dǎo)部分預(yù)期想實(shí)現(xiàn)的效果在中對(duì)應(yīng)的類型是對(duì)應(yīng)的類型是對(duì)應(yīng)的類型是但是,我們想要實(shí)現(xiàn)的是轉(zhuǎn)換成小寫(xiě)的所以我們寫(xiě)個(gè)泛型來(lái)轉(zhuǎn)換預(yù)覽鏈接定義的類型留個(gè)泛型是給復(fù)雜類型做兼容復(fù)雜的類型定義函數(shù)接收的類型最關(guān)鍵的一步根據(jù)輸入的類型計(jì)算出來(lái)函
rfc 中類型推導(dǎo)部分 Type Inference預(yù)期想實(shí)現(xiàn)的效果
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對(duì)應(yīng)的類型是StringConstructor
Number對(duì)應(yīng)的類型是NumberConstructor
Boolean對(duì)應(yīng)的類型是BooleanConstructor
但是,我們想要實(shí)現(xiàn)的是轉(zhuǎn)換成小寫(xiě)的string | number | boolean
所以我們寫(xiě)個(gè)泛型來(lái)轉(zhuǎn)換
type NormalizeType= T extends StringConstructor ? string : T extends NumberConstructor ? number : T extends BooleanConstructor ? boolean : T;
playground 預(yù)覽鏈接
定義 prop 的類型type BuiltInType= | StringConstructor | NumberConstructor | BooleanConstructor | T;
留個(gè)泛型是給復(fù)雜類型做兼容
rfc 復(fù)雜的 prop 類型
type DefaultType最關(guān)鍵的一步根據(jù)輸入的props類型計(jì)算出來(lái)setup函數(shù)接收的形參props類型= { [key: string]: | { type?: BuiltInType ; require?: boolean; } | BuiltInType ; };
type ReflexType組合出來(lái)createComponent函數(shù)定義= { [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 預(yù)覽鏈接
效果圖文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/104623.html
摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門(mén),久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...
摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門(mén),久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...
摘要:拿到的都是而不是原始值,且這個(gè)值會(huì)動(dòng)態(tài)變化。精讀對(duì)于的與,筆者做一些對(duì)比。因此采取了作為優(yōu)化方案只有當(dāng)?shù)诙€(gè)依賴參數(shù)變化時(shí)才返回新引用。不需要使用等進(jìn)行性能優(yōu)化,所有性能優(yōu)化都是自動(dòng)的。前端精讀幫你篩選靠譜的內(nèi)容。 1. 引言 Vue 3.0 的發(fā)布引起了軒然大波,讓我們解讀下它的 function api RFC 詳細(xì)了解一下 Vue 團(tuán)隊(duì)是怎么想的吧! 首先官方回答了幾個(gè)最受關(guān)注的...
閱讀 525·2023-04-26 00:33
閱讀 3549·2021-11-24 09:39
閱讀 2953·2021-09-22 15:34
閱讀 2324·2019-08-23 18:07
閱讀 2921·2019-08-23 18:04
閱讀 3710·2019-08-23 16:06
閱讀 2902·2019-08-23 15:27
閱讀 1620·2019-08-23 14:32