TypeScript 中類型轉(zhuǎn)換時(shí)為什么使用 `as number` 仍然顯示為 `string`?

TypeScript 中類型轉(zhuǎn)換時(shí)為什么使用 `as number` 仍然顯示為 `string`?

typescript 類型轉(zhuǎn)換疑難解答:as number 轉(zhuǎn)換失效

本文分析 TypeScript 中使用 as number 進(jìn)行類型轉(zhuǎn)換卻仍然顯示為 String 類型的問(wèn)題,并提供正確的解決方案。

問(wèn)題描述

開發(fā)者在使用 as number 進(jìn)行類型轉(zhuǎn)換時(shí),發(fā)現(xiàn)即使已聲明變量為 number 類型,運(yùn)行時(shí)仍然顯示為 string 類型。代碼示例如下:

const props = defineProps()  getDictGroup(props.group)  export const getDictGroup = async (sid: number) => {   const dict = await getDict()   console.info(typeof sid); // 輸出 'string'   sid = sid as number;   console.info(typeof sid); // 輸出 'string'   console.info(typeof (sid as number)); // 輸出 'string' }

嘗試使用 parseInt(sid) 也遇到問(wèn)題:number 類型參數(shù)無(wú)法賦值給 string 類型函數(shù)參數(shù)。

問(wèn)題根源

as 關(guān)鍵字是 TypeScript 的類型斷言,它僅僅告訴編譯器該變量應(yīng)該被視為某種類型,不會(huì)在運(yùn)行時(shí)執(zhí)行實(shí)際的類型轉(zhuǎn)換。 console.info(typeof sid) 輸出 string,是因?yàn)?sid 變量的實(shí)際值仍然是字符串。as number 只是繞過(guò)了編譯器的類型檢查,并沒(méi)有改變變量的運(yùn)行時(shí)類型。

正確的類型轉(zhuǎn)換方法

要實(shí)現(xiàn)運(yùn)行時(shí)類型轉(zhuǎn)換,需要使用相應(yīng)的轉(zhuǎn)換函數(shù):

  • 將字符串轉(zhuǎn)換為數(shù)字: Number() 或 parseInt()。Number() 會(huì)嘗試將整個(gè)字符串轉(zhuǎn)換為數(shù)字,而 parseInt() 只會(huì)轉(zhuǎn)換字符串的開頭部分,直到遇到非數(shù)字字符。

  • 將數(shù)字轉(zhuǎn)換為字符串: String()。

以下是一個(gè)正確的類型轉(zhuǎn)換示例:

let sid: string = "12345"; let numSid: number = Number(sid); // 或 parseInt(sid, 10);  (10表示十進(jìn)制) console.log(typeof numSid); // 輸出 'number' console.log(numSid); // 輸出 12345  let n: number = 12345; let strN: string = String(n); console.log(typeof strN); // 輸出 'string' console.log(strN); // 輸出 "12345"

總結(jié)

as 關(guān)鍵字用于類型斷言,而非運(yùn)行時(shí)類型轉(zhuǎn)換。 需要進(jìn)行運(yùn)行時(shí)類型轉(zhuǎn)換時(shí),必須使用 Number()、parseInt()、String() 等函數(shù)。 確保在轉(zhuǎn)換前檢查輸入數(shù)據(jù)的有效性,避免潛在的錯(cuò)誤。 如果props.group本身就是字符串,則需要在傳遞給getDictGroup函數(shù)之前進(jìn)行類型轉(zhuǎn)換。 例如:getDictGroup(Number(props.group))。 如果轉(zhuǎn)換失敗,Number()會(huì)返回NaN,需要進(jìn)行相應(yīng)的錯(cuò)誤處理。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊15 分享