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

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

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

Oct 27, 2024 am 06:15 AM

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

幹預(yù)

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

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

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

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

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

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

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)在可以聽(tīng)到您的聲音:「但是如果有人向我的 API 發(fā)送無(wú)效的 JSON 怎麼辦?」

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

以下是拜占庭為您的信任問(wèn)題聚會(huì)帶來(lái)的內(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ì)愛(ài)你(一次)

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

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

  • 運(yùn)行數(shù)千個(gè)僅檢查類型的單元測(cè)試
  • 消耗 CPU 週期一遍又一遍地檢查相同的類型
  • 凌晨 3 點(diǎn)醒來(lái),因?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
}

“但我喜歡寫測(cè)試!”

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

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

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

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

  1. 更快的發(fā)展

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

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

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

    • 更快的 CI/CD 管道
    • 降低基礎(chǔ)建設(shè)成本
    • 生產(chǎn)事故減少
    • SRE 團(tuán)隊(duì)更快樂(lè)(結(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è)庫(kù)——它是對(duì)類型信任問(wèn)題的干預(yù)。是時(shí)候放棄運(yùn)行時(shí)檢查並擁抱編譯時(shí)保證的力量了。

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

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


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

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

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

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

以上是TypeScript 幹預(yù):使用 Byzantium 打破運(yùn)行時(shí)檢查成癮的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(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)容,請(qǐng)聯(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整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

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

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

JavaScript評(píng)論:簡(jiǎn)短說(shuō)明 JavaScript評(píng)論:簡(jiǎn)短說(shuō)明 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對(duì)像有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開(kāi)始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫(kù);4.處理時(shí)區(qū)問(wèn)題建議使用支持時(shí)區(qū)的庫(kù),如Luxon。掌握這些要點(diǎn)能有效避免常見(jiàn)錯(cuò)誤。

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

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

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

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

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.事件捕獲通過(guò)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是不同的編程語(yǔ)言。 1.Java是靜態(tài)類型、編譯型語(yǔ)言,適用於企業(yè)應(yīng)用和大型系統(tǒng)。 2.JavaScript是動(dòng)態(tài)類型、解釋型語(yǔ)言,主要用於網(wǎng)頁(yè)交互和前端開(kāi)發(fā)。

See all articles