================================================================================ UTS-Android 鍏煎鎬у紑鍙戣鑼? ================================================================================ > 浠ヤ笅涓?uni-app-x (UTS) Android 绔紑鍙戝父瑙佹敞鎰忎簨椤逛笌韪╁潙鐐癸紝寤鸿鎵€鏈夊紑鍙戞垚鍛橀伒寰細 ================================================================================ 涓€銆佸熀纭€璇硶瑙勮寖 ================================================================================ 1. 鍙橀噺澹版槑 - 鍙兘浣跨敤 let 鍜?const锛屼笉鑳戒娇鐢?var - 鍙橀噺澹版槑蹇呴』鏈夋樉寮忕被鍨嬫垨鍒濆鍖栧€? - 涓嶆敮鎸?undefined 绫诲瀷锛屽彉閲忔湭璧嬪€煎氨鏄?null - 涓嶆敮鎸?undefined 鍏抽敭瀛楋紝鍒ゆ柇鏄惁瀛樺湪瑕佺敤 != null 2. 绫诲瀷瀹氫箟 - 鍙€傚悎杞?type锛屼笉閫傚悎浣跨敤 interface锛坕nterface 鍦?kotlin/swift 涓彟鏈変笉鍚岋級 - 涓嶆敮鎸?Intersection Type锛堜氦鍙夌被鍨嬶級 - 涓嶆敮鎸?Index Signature锛堢储寮曠鍚嶏級 - 绫诲瀷鎺ㄦ柇涓ユ牸锛屽繀瑕佹椂鐢?as Type 鏄庣‘绫诲瀷 - 涓嶆敮鎸佸唴鑱斿璞$被鍨嬶紙Object Literal Type锛夛紝闇€瑕佸崟鐙畾涔?type 3. 鍑芥暟瀹氫箟 - 鍑芥暟蹇呴』鍦ㄤ娇鐢ㄥ墠瀹氫箟锛堜笉鏀寔鍑芥暟鎻愬崌锛? - 鍦?setup 妯″紡涓嬶紝璋冪敤鐨勫嚱鏁板繀椤诲湪璋冪敤涔嬪墠瀹氫箟 - 渚濊禆鍏崇郴闇€瑕佹槑纭細琚皟鐢ㄧ殑鍑芥暟蹇呴』鍏堝畾涔? - 杩欎笌 JavaScript 鐨勫嚱鏁版彁鍗囪涓轰笉鍚岋紝UTS 鏇存帴杩?C/Java 鐨勭紪璇戞柟寮? 4. 寰幆 - for 寰幆鐨?i 蹇呴』鍐欐槑绫诲瀷锛歭et i: Int = 0 - 涓嶈鐢?forEach銆乵ap锛屾暟缁勯亶鍘嗙敤 for 寰幆 - 宓屽鐨勬暟缁勬柟娉曡皟鐢ㄥ彲鑳藉鑷寸被鍨嬫帹鏂け璐ワ紝搴旀敼鐢?for 寰幆 ================================================================================ 浜屻€佺被鍨嬩笌瀵硅薄璁块棶 ================================================================================ 1. any 绫诲瀷璁块棶 - 涓嶈兘鐩存帴璁块棶 any 绫诲瀷瀵硅薄鐨勫睘鎬? - 闇€瑕佸皢瀵硅薄杞崲涓?UTSJSONObject 绫诲瀷鍚庝娇鐢?getString()銆乬etNumber() 绛夋柟娉曡闂睘鎬? - any 绫诲瀷灞炴€ц闂渶杞崲涓?Record 鍚庣敤绱㈠紩璁块棶 - 浣跨敤绱㈠紩璁块棶灞炴€ф椂锛屾帹鑽愪娇鐢ㄦ柟鎷彿璇硶 obj['property'] 鑰岄潪鐐硅娉?obj.property - any 绫诲瀷涓嶆敮鎸佺储寮曡闂?obj['key']锛屽繀椤诲厛杞崲涓?UTSJSONObject 2. UTSJSONObject 浣跨敤 - 鐢?utils/utis 涓嬬殑 UTSJSONObject 鍋氱被鍨嬭浆鎹? - 涓嶈鐢?safeget锛屽彧瑕?UTSJSONObject 灏卞ソ浜? - 闇€瑕佸垱寤哄姩鎬佸璞℃椂锛屽簲浣跨敤 new UTSJSONObject() 鐒跺悗璋冪敤 .set() 鏂规硶 - 瀵逛簬 type 瀹氫箟鐨勫璞$被鍨嬶紝鍚屾牱闇€瑕佷娇鐢?UTSJSONObject - 浣跨敤 getString()銆乬etNumber() 鏂规硶鑾峰彇灞炴€у€? 3. 鏁扮粍绫诲瀷 - 鏁扮粍绫诲瀷寤鸿鍐欐垚 Array锛屼笉瑕佺敤 Type[] 绠€鍐? - 绌烘暟缁勯渶瑕佹槑纭寚瀹氱被鍨嬶紝濡?[] as string[] - 鏁扮粍鍏冪礌闇€瑕佹槑纭殑绫诲瀷瀹氫箟鎵嶈兘鍦ㄦā鏉夸腑姝g‘璁块棶灞炴€? - 瀵逛簬 any[] 鎴?reactive 鏁扮粍锛岃闂厓绱犲睘鎬ф椂闇€瑕佸厛杞崲涓?Record 鎴?any[] 4. 瀵硅薄鎿嶄綔 - 涓嶆敮鎸?Object.keys()銆丱bject.values()銆丱bject.entries() - 涓嶆敮鎸?Record 瀵硅薄瀛楅潰閲忚娉? - 瀵硅薄瀛楅潰閲?{...} 鍙兘鐢ㄤ簬鏋勯€犵被鍨嬶紙class锛夛紝涓嶈兘鐢ㄤ簬鎺ュ彛锛坕nterface锛? - reactive 瀵硅薄鍦?UTS 涓笉鏀寔绱㈠紩鍣ㄨ祴鍊兼搷浣? ================================================================================ 涓夈€佹潯浠跺垽鏂笌閫昏緫杩愮畻 ================================================================================ 1. if 鏉′欢 - if 鍒ゆ柇鍙帴鍙?boolean 绫诲瀷锛屼笉鑳芥槸鍏朵粬绫诲瀷鐨勫€? - 鍒ゆ柇绌鸿鐢?!== null锛屼笉鑳界敤 !鍙橀噺锛坲ts android 涓嶆敮鎸?!鍦ㄥ彉閲忓墠闈㈢殑鍒ゆ柇绌烘柟寮忥級 - 妯℃澘涓殑 || 杩愮畻绗﹀乏杈瑰繀椤绘槸 boolean 绫诲瀷 - 鍙┖绫诲瀷浣跨敤鍙€夐摼 ?. 鍜岀┖鍊煎悎骞??? - 瀛楃涓插垽鏂┖瑕佺敤锛歷ariable != null && variable !== '' 2. 閫昏緫杩愮畻绗? - || 琛ㄧず閫昏緫鎴? - && 琛ㄧず閫昏緫涓? - ! 琛ㄧず閫昏緫闈烇紙浣?!鍙橀噺 涓嶆敮鎸佺敤浜庡垽鏂┖锛? - ?? 琛ㄧず绌哄€煎悎骞惰繍绠楃锛堝綋宸︿晶涓?null 鏃惰繑鍥炲彸渚у€硷級 - ts 鐨勪负绌哄垯浣跨敤榛樿鍊肩殑璇硶鍦?uts 涓笉鑳界敤 ||锛岃鐢??? 鏉ヤ唬鏇? ================================================================================ 鍥涖€佺粍浠朵笌妯℃澘 ================================================================================ 1. 琛ㄥ崟涓庤緭鍏? - 琛ㄥ崟浼樺厛鐢?form 缁勪欢 - 涓嶆敮鎸?uni-easyinput锛岀敤 input 浠f浛 - 鏃堕棿閫夋嫨鐢?uni_modules/lime-date-time-picker 2. 閫夋嫨鍣? - uts android 涓嶆敮鎸?picker锛岀敤 picker-view 鎴?uni.showActionSheet - 涓€缁寸殑浼樺厛鐢?uni.showActionSheet - picker-view 鐨勪簨浠剁敤 UniPickerViewChangeEvent 3. 瀵艰埅涓庡竷灞€ - 涓嶆敮鎸?uni-nav-bar锛屽厛鍒犻櫎 - 涓嶆敮鎸?uni-data-select锛岀敤 picker-view 浠f浛 - 涓嶆敮鎸?uni-datetime-picker锛岀敤 components/picker-date 鎴?components/picker-time 浠f浛 - 涓嶆敮鎸?uni-icons 4. 妯℃澘娉ㄦ剰浜嬮」 - 璺?template 浜や簰鐨勫彉閲忓敖閲忕敤涓€缁村彉閲忥紙涓嶈宓屽瀵硅薄锛? - 妯℃澘涓彲绌虹被鍨嬪繀椤讳娇鐢??. 瀹夊叏璁块棶 - 妯℃澘涓闂彲绌虹被鍨嬪睘鎬у墠蹇呴』鍏堝垽绌?v-if="order != null" ================================================================================ 浜斻€丆SS 鏍峰紡闄愬埗 ================================================================================ 1. 甯冨眬鏂瑰紡 - 鍙敮鎸?display: flex - 涓嶆敮鎸?display: grid - 涓嶆敮鎸?gap - 涓嶆敮鎸?table銆乬rid銆乬rid-template-columns 2. 鍗曚綅涓庤绠? - 涓嶆敮鎸?calc() - 涓嶆敮鎸佺殑鍗曚綅: vh - property value `100%` is not supported for min-height (supported values are: number|pixel) - property value `calc(33.33% - 10px)` is not supported for min-width 3. 閫夋嫨鍣? - [APP-ANDROID] 涓嶆敮鎸佷吉绫婚€夋嫨鍣? - [APP-IOS] 涓嶆敮鎸佷吉绫婚€夋嫨鍣? - ERROR: Selector `.login-button[disabled]` is not supported. uvue only support classname selector 4. 鍏朵粬鏍峰紡 - WARNING: `backdrop-filter` is not a standard property name - style property `white-space` is only supported on `| ``` 3. Map 绫诲瀷璁块棶闄愬埗 - UTS Android 涓嶆敮鎸?Map 绫诲瀷鐨?get() 鏂规硶璁块棶灞炴€? - 搴旂粺涓€浣跨敤 UTSJSONObject - 绀轰緥锛? ```typescript // 閿欒 const m = item as Map const idVal = m.get('id') // 姝g‘ const itemObj = item as UTSJSONObject const id = itemObj.getString('id') ?? '' ``` 4. 鍑芥暟鍐呭彇鍙嶆搷浣滅 - if (!isValid.value) 涓嶆敮鎸佸彇鍙? - 浣跨敤 if (isValid.value === false) - 绀轰緥锛? ```typescript // 閿欒 if (!isValid.value) return // 姝g‘ if (isValid.value === false) return ``` ================================================================================ 浜屽崄涓€銆?026-02-25 user 鐩綍椤甸潰淇璁板綍 ================================================================================ 1. change-password.uvue 淇 - 闂锛?oldPassword.value 鍙栧弽鎿嶄綔涓嶆敮鎸? - 淇锛氭敼涓?oldPassword.value == '' 鏄惧紡鍒ゆ柇 - 闂锛歝onst { error } = await ... 瑙f瀯璧嬪€间笉鏀寔 - 淇锛氭敼涓?const result = await ... 鐒跺悗 result.error 璁块棶 2. login.uvue 淇 - 闂锛歛s unknown as number 鍙岄噸绫诲瀷杞崲涓嶆敮鎸? - 淇锛氭敼涓?as number 鍗曚竴绫诲瀷杞崲 - 闂锛歵ypeof err === 'object' 涓嶆敮鎸? - 淇锛氫娇鐢?try-catch 鍖呰9绫诲瀷杞崲 3. forgot-password.uvue 淇 - 闂锛?emailRegex.test(this.email) 鍙栧弽鎿嶄綔涓嶆敮鎸? - 淇锛氭敼涓?emailRegex.test(this.email) == false - 闂锛歵ypeof err === 'object' 涓嶆敮鎸? - 淇锛氫娇鐢?try-catch 鍖呰9绫诲瀷杞崲 4. register.uvue 淇 - 闂锛?protocol.value 鍙栧弽鎿嶄綔涓嶆敮鎸? - 淇锛氭敼涓?protocol.value == false - 闂锛?validateEmail() 绛夊彇鍙嶆搷浣滀笉鏀寔 - 淇锛氭敼涓?validateEmail() == false ================================================================================ 浜屽崄浜屻€佸父瑙佷慨澶嶆ā寮忛€熸煡 ================================================================================ 1. 鍙栧弽鎿嶄綔淇妯″紡 ```typescript // 閿欒 if (!variable) { ... } if (!isValid.value) { ... } if (!validate()) { ... } // 姝g‘ - 鏍规嵁绫诲瀷閫夋嫨 if (variable == null || variable == '') { ... } // 瀛楃涓插垽绌? if (isValid.value == false) { ... } // 甯冨皵鍊煎彇鍙? if (validate() == false) { ... } // 鍑芥暟杩斿洖甯冨皵鍊煎彇鍙? ``` 2. 瑙f瀯璧嬪€间慨澶嶆ā寮? ```typescript // 閿欒 const { data, error } = await someAsyncCall() // 姝g‘ const result = await someAsyncCall() const data = result.data const error = result.error ``` 3. typeof 妫€鏌ヤ慨澶嶆ā寮? ```typescript // 閿欒 if (typeof err === 'object') { ... } if (typeof xxx === 'function') { ... } // 姝g‘ try { const e = err as Error // 浣跨敤 e } catch (e2) { // 澶勭悊杞崲澶辫触 } ``` 4. as unknown as 淇妯″紡 ```typescript // 閿欒 const timer = setInterval(...) as unknown as number // 姝g‘ const timer = setInterval(...) as number ``` ================================================================================ 浜屽崄涓夈€侀敊璇鐞嗘渶浣冲疄璺? ================================================================================ 1. 缁熶竴閿欒澶勭悊妯″紡 ```typescript try { const result = await someAsyncCall() if (result.error != null) { const errorMsg = (result.error as Error).message uni.showToast({ title: errorMsg, icon: 'none' }) return } // 澶勭悊鎴愬姛缁撴灉 } catch (e) { console.error('鎿嶄綔澶辫触:', e) uni.showToast({ title: '鎿嶄綔澶辫触', icon: 'none' }) } ``` 2. 鍙┖绫诲瀷瀹夊叏璁块棶 ```typescript // 瀹夊叏璁块棶瀵硅薄灞炴€? const value = obj != null ? obj.property : null // 瀹夊叏璋冪敤鏂规硶 const result = obj != null ? obj.method() : null ``` 3. 鏁扮粍瀹夊叏璁块棶 ```typescript // 瀹夊叏璁块棶鏁扮粍鍏冪礌 if (arr.length > index) { const item = arr[index] // 浣跨敤 item } ``` ================================================================================ 鏂囨。缁撴潫 ================================================================================ ================================================================================ 浜屽崄鍥涖€?026-02-27 鍑芥暟鍙€夊弬鏁伴檺鍒讹紙閲嶈锛? ================================================================================ 1. 鍙€夊弬鏁颁笉鑳借烦杩囦紶閫? - UTS Android 涓嶆敮鎸佽烦杩囧彲閫夊弬鏁颁紶閫? - 濡傛灉鍑芥暟鏈夊涓彲閫夊弬鏁帮紝蹇呴』鎸夐『搴忎紶閫掓墍鏈夊弬鏁? - 閿欒绀轰緥锛? ```typescript // 鍑芥暟瀹氫箟 async addToCart(productId: string, quantity: number = 1, skuId?: string, merchantId?: string): Promise // 閿欒璋冪敤 - 璺宠繃浜?merchantId 鍙傛暟 await supabaseService.addToCart(productId, 1, '') // 缂栬瘧閿欒锛歂o value passed for parameter 'merchantId' ``` - 姝g‘绀轰緥锛? ```typescript // 鏂规1锛氱粰鍙€夊弬鏁版坊鍔犻粯璁ゅ€? async addToCart(productId: string, quantity: number = 1, skuId: string = '', merchantId: string = ''): Promise // 鏂规2锛氳皟鐢ㄦ椂浼犻€掓墍鏈夊弬鏁? await supabaseService.addToCart(productId, 1, '', '') ``` 2. 鍙€夊弬鏁板畾涔夎鑼? - 鎺ㄨ崘浣跨敤 `param: Type = defaultValue` 鑰岄潪 `param?: Type` - `param?: Type` 鍦?Android 绔皟鐢ㄦ椂浠嶉渶浼犻€掑弬鏁? - `param: Type = defaultValue` 鍙互鍦ㄤ笉浼犲弬鏃朵娇鐢ㄩ粯璁ゅ€? - 绀轰緥锛? ```typescript // 涓嶆帹鑽?- 璋冪敤鏃朵粛闇€浼犻€掑弬鏁? function foo(a: string, b?: string, c?: string): void // 鎺ㄨ崘 - 鍙互璺宠繃鍙傛暟浣跨敤榛樿鍊? function foo(a: string, b: string = '', c: string = ''): void ``` 3. 缂栬瘧閿欒鎻愮ず - 閿欒淇℃伅锛?No value passed for parameter 'xxx'" - 鍘熷洜锛氬彲閫夊弬鏁板湪 Android 绔笉鑳借烦杩? - 瑙e喅锛? 1. 淇敼鍑芥暟绛惧悕锛屼娇鐢ㄩ粯璁ゅ€?`param: Type = defaultValue` 2. 璋冪敤鏃朵紶閫掓墍鏈夊弬鏁? 4. 鏈€浣冲疄璺? - 瀵逛簬鏈夊涓彲閫夊弬鏁扮殑鍑芥暟锛岀粺涓€浣跨敤榛樿鍊艰娉? - 璋冪敤鏃舵樉寮忎紶閫掓墍鏈夊弬鏁帮紝閬垮厤渚濊禆鍙€夊弬鏁拌烦杩? - 鍦ㄦ湇鍔″眰鍑芥暟瀹氫箟涓紝浼樺厛浣跨敤 `= ''` 鎴?`= 0` 绛夐粯璁ゅ€? ================================================================================ 浜屽崄浜斻€?026-02-27 妯℃澘涓殑闈炵┖鏂█闄愬埗锛堥噸瑕侊級 ================================================================================ 1. 妯℃澘涓笉鏀寔闈炵┖鏂█鎿嶄綔绗?`!` - UTS Android 妯℃澘涓笉鑳戒娇鐢?`variable!` 闈炵┖鏂█ - 閿欒绀轰緥锛? ```html ``` - 姝g‘绀轰緥锛? ```html ``` 2. 缂栬瘧閿欒鎻愮ず - 閿欒淇℃伅锛?鍙傛暟绫诲瀷涓嶅尮閰嶏細瀹為檯绫诲瀷涓?'Number?'锛岄鏈熺被鍨嬩负 'Number'" - 鍘熷洜锛氭ā鏉夸腑浣跨敤闈炵┖鏂█ `!` 涓嶈鏀寔 - 瑙e喅锛氱Щ闄ら潪绌烘柇瑷€ `!`锛岀洿鎺ヤ娇鐢ㄥ彉閲忚繘琛屾瘮杈? 3. 鏈€浣冲疄璺? - 鍦ㄦā鏉夸腑锛屽厛鐢?`!= null` 鍒ゆ柇鍙┖绫诲瀷锛岀劧鍚庣洿鎺ヤ娇鐢ㄥ彉閲? - UTS 缂栬瘧鍣ㄤ細鍦?`!= null` 鍒ゆ柇鍚庤嚜鍔ㄨ瘑鍒彉閲忎负闈炵┖绫诲瀷 ================================================================================ 浜屽崄鍏€?026-02-27 鏈鍏ョ被鍨嬬殑澶勭悊锛堥噸瑕侊級 ================================================================================ 1. 鏈鍏ョ殑绫诲瀷涓嶈兘鐩存帴浣跨敤 - 鍦ㄩ〉闈腑浣跨敤鐨勭被鍨嬪繀椤诲厛瀵煎叆鎴栦娇鐢?UTSJSONObject 鏇夸唬 - 閿欒绀轰緥锛? ```typescript // Shop 绫诲瀷鏈鍏? const s = shopRespData[i] as Shop const id = s.id // 鎵句笉鍒板悕绉?"id" ``` - 姝g‘绀轰緥锛? ```typescript // 浣跨敤 UTSJSONObject const s = shopRespData[i] as UTSJSONObject const id = s.getString('id') ?? '' const name = s.getString('shop_name') ?? '' ``` 2. 缂栬瘧閿欒鎻愮ず - 閿欒淇℃伅锛?鎵句笉鍒板悕绉?'XXX'" - 鍘熷洜锛氱被鍨嬫湭瀵煎叆鎴栫被鍨嬪畾涔変笉瀛樺湪 - 瑙e喅锛? 1. 瀵煎叆闇€瑕佺殑绫诲瀷锛歚import { Shop } from '@/utils/supabaseService.uts'` 2. 浣跨敤 UTSJSONObject 鏇夸唬锛歚as UTSJSONObject` 鐒跺悗鐢?`getString()`銆乣getNumber()` 璁块棶灞炴€? 3. 鏈€浣冲疄璺? - 瀵逛簬绠€鍗曠殑鏁版嵁杞崲锛屾帹鑽愪娇鐢?UTSJSONObject - 閬垮厤鍦ㄥ涓枃浠朵腑閲嶅瀹氫箟鐩稿悓鐨勭被鍨? - 濡傛灉闇€瑕佺被鍨嬪畨鍏紝浠庢湇鍔″眰瀵煎叆绫诲瀷瀹氫箟 ================================================================================ 浜屽崄涓冦€?026-02-27 鏈嶅姟灞傛暟鎹瓧娈靛畬鏁存€э紙閲嶈锛? ================================================================================ 1. 鏈嶅姟灞傝繑鍥炴暟鎹繀椤诲寘鍚墍鏈夊繀瑕佸瓧娈? - 浠庢暟鎹簱鑾峰彇鏁版嵁鏃讹紝蹇呴』姝g‘鏄犲皠鎵€鏈夐渶瑕佺殑瀛楁 - 閿欒绀轰緥锛? ```typescript const product: Product = { id: prodObj.getString('id') ?? '', name: prodObj.getString('name') ?? '', // 閿欒锛歮erchant_id 纭紪鐮佷负绌哄瓧绗︿覆 merchant_id: '' } as Product ``` - 姝g‘绀轰緥锛? ```typescript const product: Product = { id: prodObj.getString('id') ?? '', name: prodObj.getString('name') ?? '', // 姝g‘锛氫粠鏁版嵁搴撹幏鍙?merchant_id merchant_id: prodObj.getString('merchant_id') ?? '' } as Product ``` 2. 璋冪敤鏈嶅姟灞傛柟娉曟椂蹇呴』浼犻€掑畬鏁村弬鏁? - 椤甸潰璋冪敤鏈嶅姟灞傛柟娉曟椂锛岄渶瑕佷紶閫掓墍鏈夊繀瑕佸弬鏁? - 閿欒绀轰緥锛? ```typescript // 閿欒锛歮erchant_id 浼犵┖瀛楃涓? await supabaseService.addToCart(productId, 1, '', '') ``` - 姝g‘绀轰緥锛? ```typescript // 姝g‘锛氫粠鍟嗗搧瀵硅薄鑾峰彇 merchant_id const merchantId = product.merchant_id ?? '' await supabaseService.addToCart(productId, 1, '', merchantId) ``` 3. 缂栬瘧閿欒鎻愮ず - 闂琛ㄧ幇锛氭暟鎹坊鍔犲埌鏁版嵁搴撳け璐ワ紝鎴栨坊鍔犵殑鏁版嵁涓嶅畬鏁? - 鍘熷洜锛氭湇鍔″眰鎴栭〉闈㈠眰缂哄皯蹇呰瀛楁鐨勪紶閫? - 瑙e喅锛? 1. 妫€鏌ユ湇鍔″眰鏁版嵁鏄犲皠鏄惁瀹屾暣 2. 妫€鏌ラ〉闈㈣皟鐢ㄦ椂鏄惁浼犻€掍簡鎵€鏈夊繀瑕佸弬鏁? 4. 鏈€浣冲疄璺? - 鏈嶅姟灞傛柟娉曡繑鍥炵殑瀵硅薄搴斿寘鍚暟鎹簱瑙嗗浘鐨勬墍鏈夊瓧娈? - 椤甸潰璋冪敤鏈嶅姟灞傛柟娉曟椂锛屽簲浠庢暟鎹璞′腑鑾峰彇骞朵紶閫掓墍鏈夊弬鏁? - 瀵逛簬鍏宠仈鏁版嵁锛堝 merchant_id锛夛紝纭繚鍦ㄦ暟鎹姞杞芥椂涓€骞惰幏鍙? ================================================================================ 浜屽崄鍏€?026-02-27 妯℃澘涓殑闈炶繍绠楃闄愬埗锛堥噸瑕侊級 ================================================================================ 1. 妯℃澘涓笉鏀寔 `!` 闈炶繍绠楃 - UTS Android 妯℃澘涓笉鑳戒娇鐢?`!variable` 闈炶繍绠楃 - 閿欒绀轰緥锛? ```html ``` - 姝g‘绀轰緥锛? ```html ``` 2. 缂栬瘧閿欒鎻愮ず - 閿欒淇℃伅锛?鎵句笉鍒板悕绉?not'" - 鍘熷洜锛氭ā鏉夸腑涓嶆敮鎸侀潪杩愮畻绗?`!` - 瑙e喅锛氫娇鐢ㄦ樉寮忕殑姣旇緝琛ㄨ揪寮忔浛浠? 3. 鏈€浣冲疄璺? - 浣跨敤 `== null` 鎴?`== ''` 妫€鏌ョ┖鍊? - 浣跨敤 `!= null && != ''` 妫€鏌ラ潪绌哄€? ================================================================================ 浜屽崄涔濄€?026-02-27 绱㈠紩璁块棶闄愬埗锛堥噸瑕侊級 ================================================================================ 1. 涓嶆敮鎸?`(obj as any)['key']` 绱㈠紩璁块棶鏂瑰紡 - UTS Android 涓嶆敮鎸佸 any 绫诲瀷浣跨敤绱㈠紩璁块棶 - 閿欒绀轰緥锛? ```typescript const detail = (e as any)['detail'] val = detail['value'] ?? '' ``` - 姝g‘绀轰緥锛? ```typescript // 鏂规1锛氫娇鐢?UTSJSONObject const eObj = JSON.parse(JSON.stringify(e)) as UTSJSONObject const detail = eObj.get('detail') as UTSJSONObject val = detail.getString('value') ?? '' // 鏂规2锛氬厛鍒ゆ柇绫诲瀷鍐嶈浆鎹? if (e instanceof UTSJSONObject) { const eObj = e as UTSJSONObject const detail = eObj.get('detail') as UTSJSONObject val = detail.getString('value') ?? '' } ``` 2. 缂栬瘧閿欒鎻愮ず - 閿欒淇℃伅锛?Unresolved reference. None of the following candidates is applicable because of a receiver type mismatch" - 鍘熷洜锛歛ny 绫诲瀷涓嶆敮鎸佺储寮曡闂? - 瑙e喅锛氳浆鎹负 UTSJSONObject 鍚庝娇鐢?`.get()` 鏂规硶 3. 鏈€浣冲疄璺? - 缁熶竴浣跨敤 UTSJSONObject 澶勭悊鍔ㄦ€佸璞? - 浣跨敤 `.get()`銆乣.getString()`銆乣.getNumber()` 鏂规硶璁块棶灞炴€? - 瀵逛簬澶嶆潅瀵硅薄锛屽厛鐢?`JSON.parse(JSON.stringify(obj))` 杞崲 ================================================================================ 涓夊崄銆?026-02-27 瀛楃涓蹭笉鑳界洿鎺ヤ綔涓哄竷灏旀潯浠讹紙閲嶈锛? ================================================================================ 1. 瀛楃涓蹭笉鑳界洿鎺ヤ綔涓?if 鏉′欢 - UTS Android 涓嶆敮鎸佸皢瀛楃涓茬洿鎺ヤ綔涓哄竷灏旀潯浠跺垽鏂? - 閿欒绀轰緥锛? ```typescript const paramId = '123' if (paramId) { // 閿欒锛氬瓧绗︿覆涓嶈兘鐩存帴浣滀负甯冨皵鏉′欢 // ... } ``` - 姝g‘绀轰緥锛? ```typescript const paramId = '123' if (paramId != null && paramId != '') { // 姝g‘锛氭樉寮忓垽鏂? // ... } ``` 2. 缂栬瘧閿欒鎻愮ず - 閿欒淇℃伅锛?Condition type mismatch: inferred type is 'String' but 'Boolean' was expected" - 鍘熷洜锛氬瓧绗︿覆绫诲瀷涓嶈兘鐩存帴浣滀负甯冨皵鏉′欢 - 瑙e喅锛氫娇鐢ㄦ樉寮忕殑姣旇緝琛ㄨ揪寮? 3. 鏈€浣冲疄璺? - 浣跨敤 `!= null && != ''` 妫€鏌ュ瓧绗︿覆闈炵┖ - 浣跨敤 `== null || == ''` 妫€鏌ュ瓧绗︿覆涓虹┖ ================================================================================ 涓夊崄涓€銆?026-02-27 鍑芥暟瀹氫箟椤哄簭锛堥噸瑕侊級 ================================================================================ 1. 鍑芥暟蹇呴』鍦ㄨ皟鐢ㄥ墠瀹氫箟 - UTS Android 瑕佹眰鍑芥暟鍦ㄨ皟鐢ㄤ箣鍓嶅畬鎴愬畾涔? - 杩欎笌 JavaScript 鐨勫嚱鏁版彁鍗囦笉鍚? - 閿欒绀轰緥锛? ```typescript onMounted(() => { loadData() // 閿欒锛歭oadData 杩樻湭瀹氫箟 }) const loadData = async () => { // ... } ``` - 姝g‘绀轰緥锛? ```typescript const loadData = async () => { // ... } onMounted(() => { loadData() // 姝g‘锛歭oadData 宸插畾涔? }) ``` 2. 缂栬瘧閿欒鎻愮ず - 閿欒淇℃伅锛?鎵句笉鍒板悕绉?xxx'" - 鍘熷洜锛氬嚱鏁板湪璋冪敤鐐逛箣鍚庡畾涔? - 瑙e喅锛氬皢鍑芥暟瀹氫箟绉诲埌璋冪敤涔嬪墠 3. 鏈€浣冲疄璺? - 灏嗘墍鏈夊嚱鏁板畾涔夋斁鍦ㄧ敓鍛藉懆鏈熼挬瀛愶紙onMounted銆乷nShow 绛夛級涔嬪墠 - 鎸変緷璧栧叧绯绘帓搴忓嚱鏁板畾涔夐『搴? ================================================================================ 涓夊崄浜屻€?026-02-27 鑱斿悎绫诲瀷灞炴€ц闂紙閲嶈锛? ================================================================================ 1. 鑱斿悎绫诲瀷涓嶈兘鐩存帴璁块棶灞炴€? - 褰撳弬鏁扮被鍨嬩负鑱斿悎绫诲瀷锛堝 `A | B`锛夋椂锛屼笉鑳界洿鎺ヨ闂睘鎬? - 閿欒绀轰緥锛? ```typescript type A = { id: string, name: string } type B = { id: string, title: string } const foo = (item: A | B) => { const id = item.id // 閿欒锛氳仈鍚堢被鍨嬩笉鑳界洿鎺ヨ闂睘鎬? } ``` - 姝g‘绀轰緥锛? ```typescript const foo = (item: A | B) => { // 鏂规1锛氳浆鎹负 UTSJSONObject const obj = JSON.parse(JSON.stringify(item)) as UTSJSONObject const id = obj.getString('id') ?? '' // 鏂规2锛氫娇鐢ㄧ被鍨嬪畧鍗? if ('name' in item) { const id = item.id // 姝ゆ椂绫诲瀷宸叉敹绐勪负 A } } ``` 2. 缂栬瘧閿欒鎻愮ず - 閿欒淇℃伅锛?鎵句笉鍒板悕绉?xxx'" - 鍘熷洜锛氳仈鍚堢被鍨嬬殑灞炴€ц闂彈闄? - 瑙e喅锛氳浆鎹负 UTSJSONObject 鎴栦娇鐢ㄧ被鍨嬪畧鍗? 3. 鏈€浣冲疄璺? - 瀵逛簬鑱斿悎绫诲瀷鍙傛暟锛岀粺涓€杞崲涓?UTSJSONObject 澶勭悊 - 浣跨敤 `.getString()`銆乣.getNumber()` 绛夋柟娉曞畨鍏ㄨ闂睘鎬? ================================================================================ 涓夊崄涓夈€?026-02-27 any 绫诲瀷鍙橀噺涓嶈兘璧嬪€间负 null锛堥噸瑕侊級 ================================================================================ 1. any 绫诲瀷鍙橀噺涓嶈兘璧嬪€间负 null - UTS Android 涓?`any` 绫诲瀷涓嶈兘璧嬪€间负 `null` - 閿欒绀轰緥锛? ```typescript let res: any = null // 閿欒锛歂ull cannot be a value of a non-null type 'Any' ``` - 姝g‘绀轰緥锛? ```typescript let res: any = {} // 姝g‘锛氫娇鐢ㄧ┖瀵硅薄 // 鎴栬€? let res: any | null = null // 浣跨敤鑱斿悎绫诲瀷 ``` 2. 缂栬瘧閿欒鎻愮ず - 閿欒淇℃伅锛?Null cannot be a value of a non-null type 'Any'" - 鍘熷洜锛歛ny 绫诲瀷涓嶅厑璁?null 鍊? - 瑙e喅锛氫娇鐢ㄧ┖瀵硅薄 `{}` 鎴栬仈鍚堢被鍨?`any | null` ================================================================================ 涓夊崄鍥涖€?026-02-27 瀵硅薄瀛楅潰閲忕被鍨嬫帹鏂棶棰橈紙閲嶈锛? ================================================================================ 1. 瀵硅薄瀛楅潰閲忕洿鎺ヨ祴鍊肩粰 ref 鍙兘绫诲瀷涓嶅尮閰? - 褰撳璞″瓧闈㈤噺鐩存帴璧嬪€肩粰鐗瑰畾绫诲瀷鐨?ref 鏃讹紝鍙兘鎶ョ被鍨嬩笉鍖归厤閿欒 - 閿欒绀轰緥锛? ```typescript merchant.value = { id: shop.id, user_id: shop.merchant_id, // ... } // 閿欒锛欰ssignment type mismatch ``` - 姝g‘绀轰緥锛? ```typescript // 鏂规1锛氭樉寮忓0鏄庣被鍨? const merchantData: MerchantType = { id: shop.id, user_id: shop.merchant_id, // ... } merchant.value = merchantData // 鏂规2锛氫娇鐢?as 绫诲瀷鏂█ merchant.value = { id: shop.id, user_id: shop.merchant_id, // ... } as MerchantType ``` 2. 缂栬瘧閿欒鎻愮ず - 閿欒淇℃伅锛?Assignment type mismatch: actual type is '', but 'XXX' was expected" - 鍘熷洜锛氬璞″瓧闈㈤噺琚帹鏂负鍖垮悕绫诲瀷 - 瑙e喅锛氭樉寮忓0鏄庣被鍨嬫垨浣跨敤绫诲瀷鏂█ ================================================================================ 涓夊崄浜斻€?026-02-27 any 绫诲瀷涓嶈兘鐩存帴璁块棶灞炴€э紙閲嶈锛? ================================================================================ 1. any 绫诲瀷鍙傛暟涓嶈兘鐩存帴璁块棶灞炴€? - 鍦?map銆乫orEach 绛夊洖璋冧腑锛宎ny 绫诲瀷鐨勫弬鏁颁笉鑳界洿鎺ヨ闂睘鎬? - 閿欒绀轰緥锛? ```typescript const list = rawList.map((item): ProductType => { const id = item.id // 閿欒锛氭壘涓嶅埌鍚嶇О"id" const name = item.name // 閿欒锛氭壘涓嶅埌鍚嶇О"name" }) ``` - 姝g‘绀轰緥锛? ```typescript const list = rawList.map((item: any): ProductType => { // 鏂规1锛氳浆鎹负 UTSJSONObject const itemObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject const id = itemObj.getString('id') ?? '' const name = itemObj.getString('name') ?? '' // 鏂规2锛氭樉寮忔爣娉ㄥ弬鏁扮被鍨嬪苟浣跨敤绱㈠紩 // 娉ㄦ剰锛氳繖绉嶆柟寮忓湪 UTS Android 涓篃鍙兘鏈夐棶棰? }) ``` 2. 缂栬瘧閿欒鎻愮ず - 閿欒淇℃伅锛?鎵句笉鍒板悕绉?xxx'" - 鍘熷洜锛歛ny 绫诲瀷鐨勫睘鎬ц闂彈闄? - 瑙e喅锛氳浆鎹负 UTSJSONObject 鍚庝娇鐢?`.getString()` 绛夋柟娉? ================================================================================ 涓夊崄鍏€?026-02-27 绫诲瀷鏂█涓嶄細娣诲姞鏂规硶锛堥噸瑕侊級 ================================================================================ 1. `as UTSJSONObject` 涓嶄細缁欏璞℃坊鍔犳柟娉? - 浣跨敤 `as UTSJSONObject` 鍙槸绫诲瀷鏂█锛屼笉浼氳鏅€氬璞¤幏寰?`getString` 绛夋柟娉? - 閿欒绀轰緥锛? ```typescript const profileObj = profile as UTSJSONObject const id = profileObj.getString('user_id') // 杩愯鏃堕敊璇細getString is not a function ``` - 姝g‘绀轰緥锛? ```typescript // 蹇呴』浣跨敤 JSON.parse(JSON.stringify()) 杩涜鐪熸鐨勮浆鎹? const profileObj = JSON.parse(JSON.stringify(profile)) as UTSJSONObject const id = profileObj.getString('user_id') ?? '' ``` 2. 杩愯鏃堕敊璇彁绀? - 閿欒淇℃伅锛?XXX is not a function" - 鍘熷洜锛氱被鍨嬫柇瑷€鍙槸缂栬瘧鏃惰涓猴紝涓嶄細鏀瑰彉杩愯鏃跺璞$殑鏂规硶 - 瑙e喅锛氫娇鐢?`JSON.parse(JSON.stringify())` 杩涜鐪熸鐨勫璞¤浆鎹? 3. 鏈€浣冲疄璺? - 瀵逛簬浠?API 杩斿洖鐨勬暟鎹紝缁熶竴浣跨敤 `JSON.parse(JSON.stringify())` 杞崲 - 浣跨敤 `instanceof UTSJSONObject` 妫€鏌ュ璞$被鍨? - 涓嶈渚濊禆 `as` 绫诲瀷鏂█鏉ユ坊鍔犳柟娉? ================================================================================ 涓夊崄涓冦€?026-02-27 绫诲瀷蹇呴』鍖呭惈鎵€鏈夊繀濉瓧娈碉紙閲嶈锛? ================================================================================ 1. 鍒涘缓绫诲瀷瀹炰緥鏃跺繀椤诲寘鍚墍鏈夊繀濉瓧娈? - UTS 绫诲瀷瀹氫箟涓殑闈炲彲閫夊瓧娈碉紙涓嶅甫 `?`锛夐兘鏄繀濉殑 - 閿欒绀轰緥锛? ```typescript export type ProductType = { id: string merchant_id: string // 蹇呭~ category_id: string // 蹇呭~ name: string // ... } // 閿欒锛氱己灏?merchant_id銆乧ategory_id 绛夊繀濉瓧娈? return { id: item.id, name: item.name, price: item.price } as ProductType // 杩愯鏃堕敊璇細missing required property ``` - 姝g‘绀轰緥锛? ```typescript return { id: itemObj.getString('id') ?? '', merchant_id: itemObj.getString('merchant_id') ?? '', category_id: itemObj.getString('category_id') ?? '', name: itemObj.getString('name') ?? '鏈煡鍟嗗搧', description: itemObj.getString('description') ?? '', images: images, price: itemObj.getNumber('base_price') ?? 0, original_price: itemObj.getNumber('market_price') ?? 0, stock: itemObj.getNumber('total_stock') ?? 0, sales: itemObj.getNumber('sale_count') ?? 0, status: 1, created_at: itemObj.getString('created_at') ?? '' } as ProductType ``` 2. 杩愯鏃堕敊璇彁绀? - 閿欒淇℃伅锛?Failed to construct type, missing required property: xxx" - 鍘熷洜锛氱被鍨嬪畾涔変腑鏈夊繀濉瓧娈垫湭鎻愪緵 - 瑙e喅锛? 1. 妫€鏌ョ被鍨嬪畾涔夛紝纭鎵€鏈夊繀濉瓧娈? 2. 涓烘墍鏈夊繀濉瓧娈垫彁渚涘€硷紝鍗充娇鏄┖瀛楃涓叉垨榛樿鍊? 3. 鏈€浣冲疄璺? - 鏌ョ湅绫诲瀷瀹氫箟锛岀‘璁ゅ摢浜涘瓧娈垫槸蹇呭~鐨勶紙涓嶅甫 `?`锛? - 浣跨敤 `??` 杩愮畻绗︽彁渚涢粯璁ゅ€? - 瀵逛簬鍙€夊瓧娈碉紝鍙互涓嶆彁渚涙垨浣跨敤 `null` ================================================================================ 涓夊崄鍏€?026-02-27 鍥炶皟鍑芥暟涓嶈兘鏄?async锛堥噸瑕侊級 ================================================================================ 1. API 鍥炶皟鍑芥暟涓嶈兘浣跨敤 async 淇グ - uni API 鐨勫洖璋冨嚱鏁帮紙濡?showModal 鐨?success锛変笉鏀寔 async 鍑芥暟 - 閿欒绀轰緥锛? ```typescript uni.showModal({ title: '纭', content: '纭畾瑕佸垹闄ゅ悧锛?, success: async (res) => { // 閿欒锛氬洖璋冨嚱鏁颁笉鑳芥槸 async if (res.confirm) { const result = await someAsyncFunction() } } }) ``` - 姝g‘绀轰緥锛? ```typescript uni.showModal({ title: '纭', content: '纭畾瑕佸垹闄ゅ悧锛?, success: (res) => { if (res.confirm) { // 浣跨敤 Promise.then() 浠f浛 await someAsyncFunction().then((result) => { // 澶勭悊缁撴灉 }) } } }) ``` 2. 缂栬瘧閿欒鎻愮ず - 閿欒淇℃伅锛?鍙傛暟绫诲瀷涓嶅尮閰嶏細瀹為檯绫诲瀷涓?'Function1<..., UTSPromise>'锛岄鏈熺被鍨嬩负 'Function1<..., Unit>?'" - 鍘熷洜锛氬洖璋冨嚱鏁拌繑鍥?Promise 鑰岄潪 void - 瑙e喅锛氫娇鐢?`.then()` 浠f浛 `await` 3. 鏈€浣冲疄璺? - 鍦ㄥ洖璋冨嚱鏁颁腑浣跨敤 `.then()` 澶勭悊寮傛鎿嶄綔 - 灏嗗紓姝ラ€昏緫灏佽涓哄崟鐙殑鍑芥暟锛屽湪鍥炶皟涓皟鐢? ================================================================================ 涓夊崄涔濄€?026-02-27 绫诲瀷杞崲鍓嶅繀椤绘鏌ョ被鍨嬶紙閲嶈锛? ================================================================================ 1. 浣跨敤 `as` 绫诲瀷杞崲鍓嶅繀椤绘鏌ュ疄闄呯被鍨? - 鐩存帴浣跨敤 `as string` 杞崲鍙兘瀵艰嚧杩愯鏃剁被鍨嬭浆鎹㈠紓甯? - 閿欒绀轰緥锛? ```typescript const idVal = item['id'] const id = idVal as string // 閿欒锛氬鏋?idVal 鏄叾浠栫被鍨嬩細宕╂簝 ``` - 姝g‘绀轰緥锛? ```typescript const idVal = item['id'] const id = (idVal != null && typeof idVal == 'string') ? (idVal as string) : '' ``` 2. 杩愯鏃堕敊璇彁绀? - 閿欒淇℃伅锛?null cannot be cast to non-null type kotlin.String" - 閿欒淇℃伅锛?java.lang.Boolean cannot be cast to java.lang.String" - 鍘熷洜锛氱洿鎺ョ被鍨嬭浆鎹㈡椂锛屽疄闄呯被鍨嬩笌鐩爣绫诲瀷涓嶅尮閰? - 瑙e喅锛氫娇鐢?`typeof` 妫€鏌ョ被鍨嬪悗鍐嶈浆鎹? 3. 鏈€浣冲疄璺? - 浣跨敤 `typeof` 妫€鏌ョ被鍨? - 浣跨敤 `!= null` 妫€鏌ョ┖鍊? - 鎻愪緵榛樿鍊奸槻姝㈢┖鎸囬拡寮傚父 ================================================================================ 鍥涘崄銆?026-02-27 UTSJSONObject 蹇呴』姝g‘杞崲锛堥噸瑕侊級 ================================================================================ 1. `as UTSJSONObject` 涓嶄細娣诲姞鏂规硶 - 浠庢暟鎹簱杩斿洖鐨勬暟鎹渶瑕佹纭浆鎹负 UTSJSONObject - 閿欒绀轰緥锛? ```typescript const item = rawList[i] const brandObj = item as UTSJSONObject // 閿欒锛歜randObj.getString 涓嶅瓨鍦? ``` - 姝g‘绀轰緥锛? ```typescript const item = rawList[i] const brandObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject const id = brandObj.getString('id') ?? '' ``` 2. 杩愯鏃堕敊璇彁绀? - 閿欒淇℃伅锛?getString is not a function" - 鍘熷洜锛氬璞℃病鏈夋纭浆鎹负 UTSJSONObject - 瑙e喅锛氫娇鐢?`JSON.parse(JSON.stringify())` 杩涜杞崲 3. 鏈€浣冲疄璺? - 瀵逛簬浠庢暟鎹簱/API 杩斿洖鐨勬暟鎹紝缁熶竴浣跨敤 `JSON.parse(JSON.stringify())` 杞崲 - 浣跨敤 `.getString()`銆乣.getNumber()` 绛夋柟娉曞畨鍏ㄨ闂睘鎬? ================================================================================ 鍥涘崄浜屻€?026-02-27 getBoolean 鏂规硶鍙兘瀵艰嚧绫诲瀷杞崲寮傚父锛堥噸瑕侊級 ================================================================================ 1. `UTSJSONObject.getBoolean()` 鍙兘瀵艰嚧绫诲瀷杞崲寮傚父 - 褰撴暟鎹簱瀛楁绫诲瀷涓庨鏈熶笉绗︽椂锛宍getBoolean()` 鍙兘鎶涘嚭寮傚父 - 閿欒绀轰緥锛? ```typescript const isFeatured = prodObj.getBoolean('is_featured') ?? false // 鍙兘鎶涘嚭寮傚父 ``` - 姝g‘绀轰緥锛? ```typescript const isFeaturedVal = prodObj.get('is_featured') const isFeatured = (isFeaturedVal != null && typeof isFeaturedVal == 'boolean') ? (isFeaturedVal as boolean) : false ``` 2. 杩愯鏃堕敊璇彁绀? - 閿欒淇℃伅锛?java.lang.Boolean cannot be cast to java.lang.String" - 鍘熷洜锛氭暟鎹簱杩斿洖鐨勫瓧娈电被鍨嬩笌 UTSJSONObject 鏂规硶鏈熸湜鐨勭被鍨嬩笉鍖归厤 - 瑙e喅锛氫娇鐢?`.get()` 鏂规硶鑾峰彇鍘熷鍊硷紝鐒跺悗鎵嬪姩妫€鏌ョ被鍨? 3. 鏈€浣冲疄璺? - 閬垮厤浣跨敤 `.getBoolean()`锛屾敼鐢?`.get()` + `typeof` 妫€鏌? - 鍦?SQL 鏌ヨ涓槑纭寚瀹氶渶瑕佺殑瀛楁锛岄伩鍏?`SELECT *` - 瀵逛簬甯冨皵鍊硷紝浣跨敤 `typeof val == 'boolean'` 妫€鏌ョ被鍨? ================================================================================ 鍥涘崄涓夈€?026-02-27 SELECT * 鍙兘瀵艰嚧绫诲瀷杞崲闂锛堥噸瑕侊級 ================================================================================ 1. 閬垮厤浣跨敤 `SELECT *` 鏌ヨ鎵€鏈夊瓧娈? - 鏁版嵁搴撳彲鑳藉寘鍚墠绔笉闇€瑕佺殑瀛楁锛屽鑷寸被鍨嬭浆鎹㈠紓甯? - 閿欒绀轰緥锛? ```typescript .select('*') // 鍙兘杩斿洖鎰忓鐨勫瓧娈电被鍨? ``` - 姝g‘绀轰緥锛? ```typescript .select('id, name, description, base_price, market_price, main_image_url') ``` 2. 鏈€浣冲疄璺? - 鍙煡璇㈤渶瑕佺殑瀛楁 - 鍙傝€冩暟鎹簱鏂囨。纭瀛楁绫诲瀷 - 瀵逛簬瑙嗗浘锛堝 `ml_products_detail_view`锛夛紝娉ㄦ剰瀛楁鍚嶅彲鑳戒笌鍩虹琛ㄤ笉鍚? ================================================================================ 鍥涘崄鍥涖€?026-02-27 鍒涘缓杈呭姪鍑芥暟澶勭悊鏁版嵁杞崲锛堥噸瑕侊級 ================================================================================ 1. 鍒涘缓杈呭姪鍑芥暟缁熶竴澶勭悊鏁版嵁绫诲瀷杞崲 - 閬垮厤鍦ㄦ瘡涓柟娉曚腑閲嶅鍐欑被鍨嬫鏌ヤ唬鐮? - 绀轰緥锛? ```typescript // 杈呭姪鍑芥暟锛氬畨鍏ㄨ幏鍙栧瓧绗︿覆鍊? function safeGetString(obj: UTSJSONObject, key: string): string { const val = obj.get(key) if (val == null) return '' if (typeof val == 'string') return val as string if (typeof val == 'number') return (val as number).toString() if (typeof val == 'boolean') return (val as boolean) ? 'true' : 'false' return '' } // 杈呭姪鍑芥暟锛氬畨鍏ㄨ幏鍙栨暟鍊? function safeGetNumber(obj: UTSJSONObject, key: string): number { const val = obj.get(key) if (val == null) return 0 if (typeof val == 'number') return val as number if (typeof val == 'string') { const parsed = parseFloat(val as string) return isNaN(parsed) ? 0 : parsed } return 0 } // 杈呭姪鍑芥暟锛氬畨鍏ㄨ幏鍙栧竷灏斿€? function safeGetBoolean(obj: UTSJSONObject, key: string): boolean { const val = obj.get(key) if (val == null) return false if (typeof val == 'boolean') return val as boolean if (typeof val == 'string') return (val as string) === 'true' if (typeof val == 'number') return (val as number) !== 0 return false } // 杈呭姪鍑芥暟锛氫粠鍘熷鏁版嵁瑙f瀽鍟嗗搧 function parseProductFromRaw(item: any): Product { const prodObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject return { id: safeGetString(prodObj, 'id'), name: safeGetString(prodObj, 'name'), base_price: safeGetNumber(prodObj, 'base_price'), is_featured: safeGetBoolean(prodObj, 'is_featured'), // ... } as Product } ``` 2. 浼樼偣 - 浠g爜澶嶇敤锛屽噺灏戦噸澶? - 缁熶竴澶勭悊鍚勭绫诲瀷杞崲寮傚父 - 鏄撲簬缁存姢鍜屼慨鏀? 3. 鏈€浣冲疄璺? - 灏嗚緟鍔╁嚱鏁版斁鍦ㄦ枃浠堕《閮? - 瀵规墍鏈変粠鏁版嵁搴撹幏鍙栫殑鏁版嵁浣跨敤杈呭姪鍑芥暟 - 澶勭悊鎵€鏈夊彲鑳界殑绫诲瀷杞崲鎯呭喌 ================================================================================ 鍥涘崄浜斻€?026-02-27 瑙嗗浘瀛楁鍚嶅彲鑳戒笌鍩虹琛ㄤ笉鍚岋紙閲嶈锛? ================================================================================ 1. 鏁版嵁搴撹鍥剧殑瀛楁鍚嶅彲鑳戒笌鍩虹琛ㄤ笉鍚? - `ml_products_detail_view` 瑙嗗浘涓病鏈?`image_url` 瀛楁 - 鍙湁 `main_image_url` 鍜?`image_urls` 瀛楁 - 閿欒绀轰緥锛? ```typescript .select('id, name, image_url') // 閿欒锛氳鍥炬病鏈?image_url 瀛楁 ``` - 姝g‘绀轰緥锛? ```typescript .select('id, name, main_image_url, image_urls') // 姝g‘ ``` 2. 杩愯鏃堕敊璇彁绀? - 閿欒淇℃伅锛?column ml_products_detail_view.image_url does not exist" - 鎻愮ず锛?Perhaps you meant to reference the column 'ml_products_detail_view.image_urls'" - 鍘熷洜锛氭煡璇簡瑙嗗浘涓笉瀛樺湪鐨勫瓧娈? - 瑙e喅锛氬弬鑰冩暟鎹簱鏂囨。纭瑙嗗浘瀛楁鍚? 3. 鏈€浣冲疄璺? - 鏌ヨ瑙嗗浘鍓嶅厛纭瀛楁鍚? - 鍙傝€?`CONSUMER_DB_DOC.md` 鏂囨。 - 浣跨敤鏄庣‘瀛楁鍒楄〃鑰岄潪 `SELECT *` ================================================================================ 鍥涘崄鍏€?026-02-27 杈呭姪鍑芥暟搴斾娇鐢?try-catch 鍖呰锛堥噸瑕侊級 ================================================================================ 1. 杈呭姪鍑芥暟搴斾娇鐢?try-catch 鍖呰闃叉宕╂簝 - 鍦?Android 绔紝绫诲瀷杞崲鍙兘鎶涘嚭寮傚父 - 浣跨敤 try-catch 鍖呰鍙互闃叉鏁翠釜搴旂敤宕╂簝 - 绀轰緥锛? ```typescript function safeGetString(obj: UTSJSONObject, key: string): string { try { const val = obj.get(key) if (val == null) return '' if (typeof val == 'string') return val as string if (typeof val == 'number') return (val as number).toString() if (typeof val == 'boolean') return (val as boolean) ? 'true' : 'false' return '' } catch (e) { console.error('safeGetString error for key:', key, e) return '' } } function toUTSJSONObject(item: any): UTSJSONObject { if (item instanceof UTSJSONObject) { return item as UTSJSONObject } try { const str = JSON.stringify(item) return JSON.parse(str) as UTSJSONObject } catch (e) { console.error('toUTSJSONObject error:', e) return new UTSJSONObject() } } ``` 2. 浼樼偣 - 闃叉鍗曚釜瀛楁瑙f瀽澶辫触瀵艰嚧鏁翠釜搴旂敤宕╂簝 - 鎻愪緵璇︾粏鐨勯敊璇棩蹇椾究浜庤皟璇? - 杩斿洖榛樿鍊间繚璇佸簲鐢ㄧ户缁繍琛? 3. 鏈€浣冲疄璺? - 鎵€鏈夎緟鍔╁嚱鏁伴兘搴斾娇鐢?try-catch 鍖呰 - 鍦?catch 涓褰曢敊璇棩蹇? - 杩斿洖鍚堢悊鐨勯粯璁ゅ€? ================================================================================ 鍥涘崄涓冦€?026-02-27 鍟嗗搧瑙嗗浘娌℃湁 shop_id 瀛楁锛堥噸瑕侊級 ================================================================================ 1. `ml_products_detail_view` 瑙嗗浘娌℃湁 `shop_id` 瀛楁 - 鍟嗗搧閫氳繃 `merchant_id` 鍏宠仈鍟嗗/搴楅摵 - 閿欒绀轰緥锛? ```typescript .select('id, name, shop_id') // 閿欒锛氳鍥炬病鏈?shop_id 瀛楁 ``` - 姝g‘绀轰緥锛? ```typescript .select('id, name, merchant_id') // 姝g‘锛氫娇鐢?merchant_id ``` 2. 鏁版嵁搴撳瓧娈靛搴斿叧绯? - `ml_products` 琛細`merchant_id` 鍏宠仈鍟嗗 - `ml_shops` 琛細`user_id` 绛変簬鍟嗗鐨?`merchant_id` - 瑙嗗浘涓€氳繃 `merchant_id` JOIN `ml_shops` 鑾峰彇搴楅摵淇℃伅 3. 鏈€浣冲疄璺? - 鏌ヨ鍟嗗搧鏃朵娇鐢?`merchant_id` 鑰岄潪 `shop_id` - 鍙傝€?`CONSUMER_DB_DOC.md` 纭瀛楁鍚? ================================================================================ 鍥涘崄鍏€?026-02-27 any 绫诲瀷涓嶆敮鎸佺储寮曡闂紙閲嶈锛? ================================================================================ 1. UTS Android 涓?`any` 绫诲瀷涓嶆敮鎸佺储寮曡闂? - 涓嶈兘浣跨敤 `obj[key]` 璇硶璁块棶 `any` 绫诲瀷瀵硅薄鐨勫睘鎬? - 閿欒绀轰緥锛? ```typescript function safeGetString(obj: any, key: string): string { const val = obj[key] // 閿欒锛歎nresolved reference } ``` - 姝g‘绀轰緥锛? ```typescript function safeGetString(obj: UTSJSONObject, key: string): string { const val = obj.get(key) // 姝g‘锛氫娇鐢?UTSJSONObject 鐨?get 鏂规硶 } ``` 2. 缂栬瘧閿欒鎻愮ず - 閿欒淇℃伅锛?Unresolved reference. None of the following candidates is applicable because of a receiver type mismatch" - 鍘熷洜锛歚any` 绫诲瀷涓嶆敮鎸佺储寮曡闂? - 瑙e喅锛氬厛灏嗗璞¤浆鎹负 `UTSJSONObject`锛屽啀浣跨敤 `.get()` 鏂规硶 3. 鏈€浣冲疄璺? - 浣跨敤 `toUTSJSONObject()` 鍑芥暟灏?`any` 杞崲涓?`UTSJSONObject` - 浣跨敤 `.get()`銆乣.getString()`銆乣.getNumber()` 绛夋柟娉曡闂睘鎬? - 杈呭姪鍑芥暟鍙傛暟绫诲瀷搴斾负 `UTSJSONObject` 鑰岄潪 `any` ================================================================================ 鍥涘崄涔濄€?026-02-27 浣跨敤 getString/getNumber/getBoolean 鏂规硶锛堥噸瑕侊級 ================================================================================ 1. UTSJSONObject 鎻愪緵浜嗙被鍨嬪畨鍏ㄧ殑璁块棶鏂规硶 - `getString(key)` - 鐩存帴杩斿洖瀛楃涓叉垨 null - `getNumber(key)` - 鐩存帴杩斿洖鏁板€兼垨 null - `getBoolean(key)` - 鐩存帴杩斿洖甯冨皵鍊兼垨 null - `getArray(key)` - 鐩存帴杩斿洖鏁扮粍鎴?null - 杩欎簺鏂规硶姣?`.get()` 鏇村畨鍏紝浼氳嚜鍔ㄨ繘琛岀被鍨嬭浆鎹? 2. 鎺ㄨ崘鐢ㄦ硶 ```typescript // 鎺ㄨ崘浣跨敤 const name = obj.getString('name') ?? '' const price = obj.getNumber('price') ?? 0 const isActive = obj.getBoolean('is_active') ?? false const images = obj.getArray('images') as string[] ?? [] // 涓嶆帹鑽愪娇鐢?.get() 鍚庢墜鍔ㄧ被鍨嬫鏌? const val = obj.get('key') if (typeof val == 'string') { ... } ``` 3. 鏈€浣冲疄璺? - 浼樺厛浣跨敤 `getString()`銆乣getNumber()`銆乣getBoolean()`銆乣getArray()` - 浣跨敤 `??` 鎻愪緵榛樿鍊? - 鍦?catch 鍧椾腑澶勭悊寮傚父 ================================================================================ 鍥涘崄涓€銆?026-02-27 item as UTSJSONObject 涓嶄細娣诲姞鏂规硶锛堥噸瑕侊級 ================================================================================ 1. `item as UTSJSONObject` 涓嶄細璁╁璞¤幏寰?`getString` 绛夋柟娉? - 鐩存帴浣跨敤 `as UTSJSONObject` 鍙槸绫诲瀷鏂█锛屼笉浼氭敼鍙樿繍琛屾椂瀵硅薄 - 閿欒绀轰緥锛? ```typescript const item = rawList[i] const prodObj = item as UTSJSONObject // 閿欒锛歡etString 涓嶅瓨鍦? const id = prodObj.getString('id') // 杩愯鏃堕敊璇? ``` - 姝g‘绀轰緥锛? ```typescript const item = rawList[i] const prodObj = JSON.parse(JSON.stringify(item)) as UTSJSONObject const id = prodObj.getString('id') ?? '' // 姝g‘ ``` 2. 杩愯鏃堕敊璇彁绀? - 閿欒淇℃伅锛?getString is not a function" - 鍘熷洜锛氬璞℃病鏈夋纭浆鎹负 UTSJSONObject - 瑙e喅锛氫娇鐢?`JSON.parse(JSON.stringify())` 杩涜杞崲 3. 鏈€浣冲疄璺? - 瀵逛簬浠庢暟鎹簱/API 杩斿洖鐨勬暟鎹紝缁熶竴浣跨敤 `JSON.parse(JSON.stringify())` 杞崲 - 浣跨敤 `.getString()`銆乣.getNumber()` 绛夋柟娉曞畨鍏ㄨ闂睘鎬? ================================================================================ ================================================================================