我們在使用 Yup 時,很常會使用 Yup.addMethod
來新增自訂的驗證方式,但如果專案是 Typescript 的卻沒有加上適當的 Type,會使編譯時出現錯誤。
這時候我們為加上正確的 Type,不只不會出現錯誤,使用上也更方便。
為自訂驗證方法新增支援 Typescript
- 首先我們先使用
Yup.addMethod
建立一個驗證方法,以下使用「驗證是否為有效 json」為範例。
yup.ts
import * as Yup from 'yup';
Yup.addMethod(Yup.string, 'json', function (
this: Yup.DateSchema,
message?: string
) {
return this.test('json', message || '這不是一個有效的 Json', function (this: TestContext, value: string) {
return isEmpty(value) || (typeof value === 'string' && isValidJson(value));
});
});
- 接下來只要透過
declare module 'Yup'
來宣告這個驗證方法的 Type 即可。如果自訂驗證是新增在string()
則介面部分就必須指定StringSchema
,其他型態的也是如此,且一次就可以宣告多個方法。
yup.ts
declare module 'Yup' {
interface StringSchema {
/**
* 確認字串是否是 Json 格式
*/
json (message?: string): StringSchema;
}
}
- 最後要記得在剛剛設定
declare
的檔案,最後使用export
去匯出 Yup,並在專案的頂層去載入它,以下範例用Index.tsx
。
yup.ts
export default Yup;
Index.tsx
import './lib/yup';
const Index: React.FC = () => {
return <App />;
}
使用時就跟其他內建的 Yup 驗證方式一樣。
import { string } from 'yup';
const schmea = object({
json: string().json()
})
這樣為自訂驗證新增 Type 後,不僅使用上會有自動補全,也可利用 IDE 找到所有有用到這個驗證方法的地方。
完整 Code
yup.ts
import * as Yup from 'yup';
declare module 'Yup' {
interface StringSchema {
/**
* 確認字串是否是 Json 格式
*/
json (message?: string): StringSchema;
}
}
Yup.addMethod(Yup.string, 'json', function (
this: Yup.DateSchema,
message?: string
) {
return this.test('json', message || '這不是一個有效的 Json', function (this: TestContext, value: string) {
return isEmpty(value) || (typeof value === 'string' && isValidJson(value));
});
});
export default Yup;
參考資料
Puck Wang
Hi! 我是 Puck Wang,這個部落格的作者,是一位全端網站開發者,常使用 .Net 和 React 進行開發,專注於架構研究,你可以在這個部落格看到我精選的筆記內容,希望對你會有所幫助。
更多關於我的訊息,可至關於關於頁面。