作者: Carlos(賓)

  • [TypeScript] 關於型別系統

    TypeScript 有七種原始資料型別(primitive):

    • null
    • undefined
    • boolean
    • string
    • number
    • bigint // 0n, 2n, -4n
    • symbol // Symbol(), Symbol(“hi”)

    註:在 JS 當中,能表示的範圍整數為 Math.pow(-2, 53)+1 到 Math.pow(2, 53) – 1,若超過這個範圍,建議可使用 bigint 型別。

    型別系統

    型別系統(type system),是一組規則,主要是讓程式理解編譯語言中,可能具有的結構型別。

    運作邏輯如下:

    • 讀取所寫的程式碼,並分析所有型別和數值。
    • 對於每個數值,檢查其初始宣告,有包含哪些型別。
    • 對於每個數值,檢查後續的程式碼中,使用它的所有方式。
    • 如果數值的用途與其型別不相符,就向開發者報出可能的警告或錯誤訊息。

    型別註記

    關於 any

    宣告一個變數,沒有給它初始值。在預設的情況下,TypeScript 會預設該變數是 any 型別:該型別的意思是可以是任何資料型態都可。

    也就是 TypeScript 不會強制執行給它任何特定的型別,而是會在每次指派新資料的時候,對該變數型別做解析。

    例:

    let rocker;            // 型別是 any
    
    rocker = "Carlos";     // 型別會變成是 string
    rocker.toUpperCase();  // 可以正常執行該函式
    
    rocker = 19.58;        // 型別會變成是 number
    rocker.toPrecision(1); // 可以正常執行該函式
    
    rocker.toUpperCase(); // 會報錯,型別 number 沒有 toUpperCase() 函式。

    註:儘量不要將變數設定成 any 型別,還為違反了 TypeScript 型別檢查的目的!當 TypeScript 知道資料應該是什麼型別時,效果才是最好的。

    型別註記的表示

    TypeScript 提供了一種表示方式,無須給它初始值,即可宣告該變數是什麼型別,稱為型別註記(type annotation)。型別註記放在變數名稱之後,包含一個冒號,後面緊接著一個型別名稱。例:

    let rocker: string; // 此為型別註記,rocker 變數為 string 型別
    rocker = "test name";

    註:型別系統中的任何內容程式,都不會被複製到輸出的 JavaScript 中。因此,TypeScript 型別不會影響 JavaScript。

    不必要的型別註記

    例如以下例子,string 型別註記就是多餘的,因為 TypeScript 已經可以推斷出 firstName 是 string 型別:

    let firstName: string = "Mary";

    型別樣式

    型別也可以是更複雜的樣式,尤其是物件。在以下的例子中,TypeScript 知道 cher 物件沒有 middleName 屬性,所以提出警示:

    let cher = {
      firstName: "abc",
      lastName: "def"
    };
    
    cher.middleName; // 型別 '{ firstName: string; lastName: string; }' 沒有屬性 'middleName'。

  • [財報] 什麼是資產負債表?

    資產負債表是顯示公司在某個特定時間點的財務狀況,例如:2023 年 12 月 31 日這個時間點的財務狀況。

    單一的資產負債表可能提供一些公司過去的表現狀況,但只有跟之後公佈的資產負債表及損益表做比較,才能進行有意義的研究。

    資產負債表的意義

    基本的意義,其實就是公司在特定時間點,「擁有」多少及「虧欠」多少。

    公司「擁有」的部分,顯示在「資產」類別,包含:

    • 有形資產。
    • 現金。
    • 投資的款項。
    • 別人積欠公司的金額。
    • 無形資產(例:商譽)。

    公司「虧欠」的部分,顯示在「負債」類別,除了債務之外,還包含其它各種準備金、股東權益等,包含:

    • 應付帳款
    • 債券
    • 票據
    • 準備金
    • 股東權益

    關於股東權益

    股東權益列在負債的部份,以股本(Capital)公積(Surplus)呈現。

    這個項目列在負債的原因,是因為它們代表公司虧欠股東的款項。

    但如果把股東權益視為資產與負債之間的「差額」,會是更好的想法。

    基本的資產負債表示意圖

    資產 $5,000,000負債 $4,000,000
    股本和公積 $1,000,000
    合計 $5,000,000合計 $5,000,000

    也可以想成:

    資產$5,000,000
    減負債$4,000,000
    股東權益(股本和公積)$1,000,000

    結論

    資產負債表當中的總資產永遠等於總負債,因為股東權益(股本與公積)這個項目,是經由計算所取得,能夠讓兩邊平衡(相等)。

  • [TypeScript] 安裝 TypeScript

    第一步:安裝 Node.js

    需先安裝 Node.js 的執行環境,因為要透過 npm 來安裝 TypeScript。

    第二步:安裝 TypeScript

    執行以下指令:

    $ npm install -g typescript

    如果遇到資料夾權限的問題,就前面加個 sudo 即可。

    第三步:查看所安裝的版本

    執行以下指令:

    $ tsc --version
    Version 5.6.3

    以上其實就算安裝完成了。然後若要在專案資料夾中,建立 TypeScript 的設定檔的話,執行以下的第四步。

    第四步:產生設定檔

    在網站專案資料夾下,執行以下指令:

    $ tsc --init

    就會產生 tsconfig.json 檔案,這就是 TypeScript 的設定檔。

    然而若想要測試看看 TypeScript Compiler 功能的話,可看以下第五步。

    第五步:將 ts 檔案編譯成 js 檔

    假設有一個檔案叫做 index.ts,內容如下:

    console.log("test");

    那麼執行以下指令:

    $ tsc index.ts

    就會在同一個資料夾下,產生了 index.js 檔案,
    這就是將 index.ts 檔案編譯成可以在瀏覽器中執行的 index.js 檔案。

  • [CSS] vh、svh、lvh、dvh

    vh 這個單位的意思是 viewport height,也就是瀏覽器當中的可視區域範圍高度,那麼什麼是 svh、lvh、dvh 呢?如下說明:

    • vh:viewport height。
    • svh:small viewport height。
    • lvh:large viewport height。
    • dvh:dynamic viewport height。

    結論:用 dvh 就對了,太好用了。

    什麼是 (small/large/dynamic) viewport height

    從以下這張示意圖來看,很清礎可以得知 100svh 指的是什麼樣的高度,100lvh 指的是什麼樣的高度。

    問題點在呢?

    用 100vh 的時候,因為會不包含行動版瀏覽器上的網址列那條,因為網址列那條有時在上下瀏覽頁面的過程當中,有時出現、有時消失,所以 100vh 常常會超出可視區域範圍。

    使用 dvh

    那麼使用了 dvh 就不會有這個問題,設定 100dvh,會依據目前的可視範圍實際有多少,會動態的改變,錄了一段螢幕畫面,觀察看看就知道結果了:

    取得測試的原始碼

  • [iPhone 發現] 如何調整鬧鐘的音量?

    [iPhone 發現] 如何調整鬧鐘的音量?

    最近新買的 iPhone 16 Pro,設定了早上起床的鬧鐘,但發現超級大聲,有點被驚醒,然後發現在鬧鐘 APP 當中,不能直接調整音量大小。那該在哪邊調整鬧鐘的音量呢?

    在「設定」→「聲音與觸覺回饋」→「鈴聲和提示聲」,就可以透過滑桿來調整囉。如下示意圖: