Skip to content

Scalar

scalar 是單一個值:字串、數字、布林值、時間。model 有屬性,scalar 沒有。

每個 TypeSpec scalar 對應一個 JSON Schema 的 type。JSON Schema 另外有 format 可以標示更精確的種類(例如 int32date-time),對得上的就一併寫出。

具名 scalar 跟具名 model 一樣:先在 components.schemas 定義一次,其他地方用 $ref 引用。

內建 scalar

TypeSpectypeformat
stringstring
booleanboolean
integerinteger—(抽象型別,寬度未定)
numericfloatnumber—(抽象型別,寬度未定)
int8 / int16 / int32 / int64integerint8 / int16 / int32 / int64
safeintintegerint64
uint8 / uint16 / uint32 / uint64integeruint8 / uint16 / uint32 / uint64
float32numberfloat
float64numberdouble
decimalnumberdecimal
decimal128numberdecimal128
bytesstringbyte
plainDatestringdate
plainTimestringtime
utcDateTimeoffsetDateTimestringdate-time
durationstringduration
urlstringuri

Intrinsic 型別:

TypeSpec輸出意思
null{ type: "null" }
nevervoid{ not: {} }任何值都不合法
unknown{}任何值都合法

使用者自訂 scalar

extends 可以從既有的 scalar 衍生新的。形狀沿用基底,再加上自己的文件與驗證關鍵字。規則定義在 scalar 上,每個用到它的欄位都自動帶著:

typespec
@doc("An RFC 5321 mailbox address.")
@maxLength(254)
scalar Email extends string;

model Account {
  email: Email;
}
yaml
components:
  schemas:
    Email:
      type: string
      description: An RFC 5321 mailbox address.
      maxLength: 254
    Account:
      type: object
      properties:
        email:
          $ref: "#/components/schemas/Email"
      required:
        - email

屬性重複宣告 scalar 已經帶了的關鍵字時(例如 scalar 有 @minLength(5),屬性又標 @minLength(2)),後者不會覆蓋前者。兩個限制用 allOf 疊加,兩者都要成立

TIP

描述業務概念時特別好用。EmailOrderIdPercentage 這類東西在系統裡到處出現,把規則寫在 scalar 上定義一次,之後每個欄位都會自動帶著同樣的約束,不必逐一標註,也不會有人漏標。改規則時也只要改一個地方。