国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 web前端 js教程 TypeScript 幹預(yù):使用 Byzantium 打破運(yùn)行時(shí)檢查成癮

TypeScript 幹預(yù):使用 Byzantium 打破運(yùn)行時(shí)檢查成癮

Oct 27, 2024 am 06:15 AM

聽著,我們需要談?wù)勀愕念愋蜋z查癮。是的,您-在您的身分驗(yàn)證中間件中進(jìn)行了 47 個(gè)instanceof 檢查。編寫的測試案例多於實(shí)際程式碼的開發(fā)人員。將 TypeScript 視為只是花哨的 JSDoc 註釋的人。

幹預(yù)

讓我為你畫一幅圖畫:現(xiàn)在是中午,你正在喝第四杯咖啡,並且正在調(diào)試一個(gè)生產(chǎn)問題。日誌顯示使用者以某種方式通過了十五層運(yùn)行時(shí)驗(yàn)證。你的單元測試比 Twitter 的活躍用戶還要多,但不知何故,不知何故,有人設(shè)法在應(yīng)該是字符串的地方發(fā)送了一個(gè)數(shù)字。

「但那是不可能的!」你哭了,滾動(dòng)瀏覽測試覆蓋率報(bào)告,顯示原始的 100%。 「我檢查過這個(gè)!」

你有嗎?你真的嗎?或者您只是將同一張支票寫了三次:

  1. 一旦進(jìn)入 TypeScript 介面
  2. 再次在您的驗(yàn)證中間件
  3. 再次在單元測試

停止測試 TypeScript 已經(jīng)知道的內(nèi)容

這是一個(gè)革命性的想法:如果我們......信任編譯器會(huì)怎麼樣?我知道,瘋狂的概念。但請聽我說完。

interface ValidRabbit {
    username: string;
    password: string;
}
interface InvalidRabbit {
    username: number;
    password: string;
}


type ValidateRabbit<Rabbit> = Assert<
    //assert that Rabbit is of type {username, password}
    Is.Type<
        User,
        {
            username: string;
            password: string;
        }
    >,
    //custom compile time exceptions
    "Trix are for kids. Provide a username and password.",
    User
>;

// Ha! Silly Rabbit...
function checkRabbit<T>(rabbit: ValidateRabbit<T>) {
    // .... protect your trix
}

declare const rabbit1: ValidRabbit;
declare const rabbit2: InvalidRabbit;

checkRabbit(rabbit1);
checkRabbit(rabbit2);
/**        ~~~~~~~~~
 *           └───── Type Exception! "...Provide a username and password"
 */

“但是生產(chǎn)呢?”

我現(xiàn)在可以聽到您的聲音:「但是如果有人向我的 API 發(fā)送無效的 JSON 怎麼辦?」

首先,誰傷害了你?其次,是的,驗(yàn)證您的 API 邊界。但是,一旦該資料進(jìn)入您的打字稿域,就該放手了。讓編譯器成為你的保鑣。

以下是拜占庭為您的信任問題聚會(huì)帶來的內(nèi)容:

// Define your trust boundaries
type APIRequest<Request> = Assert<
    And<
    Is.On<Request, "body">,
    Or<Is.In<Request["method"], "POST">, Is.In<Request["method"], "PUT">>
>;,
    "Someone's being naughty with our API"
>;

// Now everything inside is type-safe
function handleRequest<R>(req: APIRequest<R>) {
    // If it compiles, it's valid
    // If it's valid, it compiles
    // This is the way
}

DevOps 團(tuán)隊(duì)會(huì)愛你(一次)

想像一下:您的 CI/CD 管道在幾分鐘內(nèi)完成,而不是幾小時(shí)。您的生產(chǎn)日誌中不會(huì)充滿類型錯(cuò)誤。您的 AWS 帳單看起來不像電話號碼。

怎麼樣?因?yàn)榘菡纪㈩愋蜋z查移至編譯時(shí)。沒有了:

  • 運(yùn)行數(shù)千個(gè)僅檢查類型的單元測試
  • 消耗 CPU 週期一遍又一遍地檢查相同的類型
  • 凌晨 3 點(diǎn)醒來,因?yàn)橛腥藢?undefined 傳遞給一個(gè)明確表示需要字串的函數(shù)
// Before: Your CPU crying for help
function validateUserMiddleware(req, res, next) {
    try {
        validateId(req.params.id)        // CPU cycle
        validateBody(req.body)           // CPU cycle
        validatePermissions(req.user)    // CPU cycle
        validateToken(req.headers.auth)  // CPU cycle
        // Your CPU is now considering a career change
        next()
    } catch (e) {
        res.status(400).json({ error: e.message })
    }
}

// After: Your CPU sending you a thank you note
type ValidRequest = Assert<
    And<
        Is.On<Request, 'params.id'>,
        Is.On<Request, 'body'>,
        Is.On<Request, 'user'>,
        Is.On<Request, 'headers.auth'>
    >,
    "Invalid request shape"
>;

function handleRequest(req: ValidRequest) {
    // Just business logic, no trust issues
}

“但我喜歡寫測試!”

The TypeScript Intervention: Breaking Your Runtime Check Addiction with Byzantium
偉大的!為真正需要測試的東西編寫測試:

  • 業(yè)務(wù)邏輯
  • 整合點(diǎn)
  • 使用者工作流程
  • 複雜演算法

你知道什麼不需要測試嗎?字串是否實(shí)際上是字串。讓 TypeScript 來處理這場生存危機(jī)。

真實(shí)的談話:好處

  1. 更快的發(fā)展

    • 不再用三種不同的方式寫相同的驗(yàn)證
    • 在編譯時(shí)捕獲錯(cuò)誤,而不是在凌晨 3 點(diǎn)
    • 花時(shí)間在功能上,而不是驗(yàn)證樣板
  2. 更好的性能

    • 型檢的零運(yùn)轉(zhuǎn)時(shí)開銷
    • 更小的套件大?。o驗(yàn)證庫)
    • 快樂的CPU,快樂的生活
  3. 提高安全性

    • 類型級保證無法被繞過
    • 不再有「哎呀,忘了驗(yàn)證」
    • 預(yù)設(shè)完全覆蓋
  4. DevOps 夢想

    • 更快的 CI/CD 管道
    • 降低基礎(chǔ)建設(shè)成本
    • 生產(chǎn)事故減少
    • SRE 團(tuán)隊(duì)更快樂(結(jié)果可能會(huì)有所不同)

入門

interface ValidRabbit {
    username: string;
    password: string;
}
interface InvalidRabbit {
    username: number;
    password: string;
}


type ValidateRabbit<Rabbit> = Assert<
    //assert that Rabbit is of type {username, password}
    Is.Type<
        User,
        {
            username: string;
            password: string;
        }
    >,
    //custom compile time exceptions
    "Trix are for kids. Provide a username and password.",
    User
>;

// Ha! Silly Rabbit...
function checkRabbit<T>(rabbit: ValidateRabbit<T>) {
    // .... protect your trix
}

declare const rabbit1: ValidRabbit;
declare const rabbit2: InvalidRabbit;

checkRabbit(rabbit1);
checkRabbit(rabbit2);
/**        ~~~~~~~~~
 *           └───── Type Exception! "...Provide a username and password"
 */

選擇是你的

您可以繼續(xù)生活在恐懼中,為所有內(nèi)容編寫運(yùn)行時(shí)檢查,將 TypeScript 視為 JavaScript 的可選類型。

或您可以在 2024 年加入我們,我們信任我們的編譯器並讓它完成其工作。

記?。好看文銓憟?zhí)行時(shí)間類型檢查時(shí),TypeScript 編譯器都會(huì)在某個(gè)地方哭泣。

結(jié)論

Byzantium 不僅僅是另一個(gè)庫——它是對類型信任問題的干預(yù)。是時(shí)候放棄運(yùn)行時(shí)檢查並擁抱編譯時(shí)保證的力量了。

您的 CPU 會(huì)感謝您的。您的 DevOps 團(tuán)隊(duì)會(huì)感謝您。您的用戶會(huì)感謝您(因?yàn)闆]有發(fā)現(xiàn)與類型相關(guān)的錯(cuò)誤)。

最重要的是,你會(huì)在凌晨 3 點(diǎn)感謝自己,當(dāng)時(shí)你睡得很熟,而不是在生產(chǎn)中調(diào)試類型錯(cuò)誤。


P.S.如果您仍然不相信,請嘗試計(jì)算程式碼庫中有多少個(gè)運(yùn)行時(shí)類型檢查。然後乘以你的小時(shí)費(fèi)率。這就是你花了多少時(shí)間不信任 TypeScript。

P.P.S.在撰寫這篇文章的過程中,沒有人受傷。儘管一些運(yùn)行時(shí)檢查已永久停用。

*P.P.P.S。如果您想做出貢獻(xiàn),請?jiān)L問我的 Github 並克隆該存儲(chǔ)庫。一切都還是新鮮的,所以有很多貢獻(xiàn)的機(jī)會(huì)。

JSR.io 上提供的文件和套件

以上是TypeScript 幹預(yù):使用 Byzantium 打破運(yùn)行時(shí)檢查成癮的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語言,各自適用於不同的應(yīng)用場景。 Java用於大型企業(yè)和移動(dòng)應(yīng)用開發(fā),而JavaScript主要用於網(wǎng)頁開發(fā)。

JavaScript評論:簡短說明 JavaScript評論:簡短說明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對像有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫;4.處理時(shí)區(qū)問題建議使用支持時(shí)區(qū)的庫,如Luxon。掌握這些要點(diǎn)能有效避免常見錯(cuò)誤。

JavaScript與Java:開發(fā)人員的全面比較 JavaScript與Java:開發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

為什麼要將標(biāo)籤放在的底部? 為什麼要將標(biāo)籤放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript:探索用於高效編碼的數(shù)據(jù)類型 JavaScript:探索用於高效編碼的數(shù)據(jù)類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

什麼是在DOM中冒泡和捕獲的事件? 什麼是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個(gè)階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。 1.事件捕獲通過addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委託,提高動(dòng)態(tài)內(nèi)容處理效率;5.捕獲可用於提前攔截事件,如日誌記錄或錯(cuò)誤處理。了解這兩個(gè)階段有助於精確控制JavaScript響應(yīng)用戶操作的時(shí)機(jī)和方式。

Java和JavaScript有什麼區(qū)別? Java和JavaScript有什麼區(qū)別? Jun 17, 2025 am 09:17 AM

Java和JavaScript是不同的編程語言。 1.Java是靜態(tài)類型、編譯型語言,適用於企業(yè)應(yīng)用和大型系統(tǒng)。 2.JavaScript是動(dòng)態(tài)類型、解釋型語言,主要用於網(wǎng)頁交互和前端開發(fā)。

See all articles