跳到內容

屬性

屬性(Property)是 Object 上的具名欄位,由 Type schema 定義。它們儲存在 Markdown 檔案的 YAML frontmatter 中,讓每個 Object 在自由格式的內文之外,還擁有結構化、可查詢的資料。

每個 Object 都支援七個由 TypeMD 管理的系統屬性。這些屬性提供每個知識管理工具都需要的基礎中繼資料——身份識別、描述、時間追蹤、分類、保護和歸檔——使用者不需要在每個 type schema 中自行定義。並非所有系統屬性都會出現在每個 Object 的 frontmatter 中:name 會在建立時自動填入,created_atupdated_at 在使用 CLI 時設定,而 descriptiontagslockedarchived 只在使用者明確設定後才會出現。

屬性說明可變性為什麼需要
name顯示名稱,建立時從 slug 自動填入。缺少或為空時,會 fallback 到由檔名衍生的 Display ID使用者撰寫將顯示名稱與檔名解耦——支援空格、大小寫和重新命名而不需搬動檔案
description選填的單行摘要,用於列表顯示和搜尋結果使用者撰寫提供跨所有 type 的一致摘要欄位,用於列表顯示、搜尋結果和 API 回應
created_at建立時間戳記,RFC 3339 格式(僅設定一次,不會修改)自動管理支援依建立日期排序,理解 vault 的時間軸
updated_at最後修改時間戳記,RFC 3339 格式(每次儲存時更新)自動管理支援依最近修改排序,追蹤 Object 的演變
tags標籤參照的陣列(關聯到內建 tag 型別,支援多值)使用者撰寫跨 type 的橫切分類
locked鎖定物件,防止編輯使用者撰寫保護已完成或歸檔的 Object 不被意外修改
archived軟刪除標記——從預設查詢中隱藏物件使用者撰寫讓不再活躍的 Object 退場而不永久刪除

使用者撰寫的屬性(namedescriptiontagslockedarchived)可以被 object template 覆蓋。自動管理的屬性(created_atupdated_at)無法被覆蓋——它們永遠反映實際的建立和修改時間。

這些名稱是保留的,不能在 type schema 或共用屬性中使用。唯一的例外是 name,可以出現在 properties 中並搭配 template 欄位來設定 name template

除了上述七個儲存的系統屬性外,TypeMD 還提供在執行時期解析的非儲存屬性——它們不會出現在 YAML frontmatter 中。

屬性類別來源說明
object_type衍生檔案路徑 objects/<type>/Object 的型別名稱
created_by衍生Git 歷史紀錄初次 commit 的作者
links計算Markdown 內文對外的 wiki-link 參照
backlinks計算索引來自其他 Object 的 wiki-link 反向參照
updated_by計算Git 歷史紀錄最近一次 commit 的作者

衍生(derived)屬性的值從結構或中繼資料推導而來,具有穩定性——一旦 Object 建立後,這些值幾乎不會改變。計算(computed)屬性的值是動態的,可能隨著 Object 的內容或 vault 狀態的變化而改變。

所有非儲存屬性都是唯讀的。嘗試透過 SetProperty 設定會回傳錯誤,而 frontmatter 中出現的值會在儲存時被移除。這些名稱同樣是保留的,不能在 type schema 中使用。

Type schema 中的每個屬性都有一個 type,決定它接受什麼值以及如何驗證。

型別說明值範例
string純文字"Go in Action"
number整數或浮點數423.14
dateYYYY-MM-DD 格式的日期"2026-03-09"
datetimeISO 8601 日期時間"2026-03-09T10:30:00+08:00"
url網址(僅限 http/https)"https://example.com"
checkbox布林值truefalse
select從選項中單選"reading"
multi_select從選項中多選["fiction", "sci-fi"]
relation連結到另一個 Object"person/alan-donovan"
  • string — 接受任何文字值。
  • number — 接受整數和浮點數。
  • date — 接受 YYYY-MM-DD 格式的日期。YAML 自動解析的日期(例如不加引號的 2026-03-09)也會被接受。
  • datetime — 接受 ISO 8601 日期時間值,必須至少包含時和分。
  • url — 接受以 http://https:// 開頭的網址。不支援其他協定(ftp、ssh 等)。
  • checkbox — 僅接受布林值 truefalse。字串值如 "true" 會被拒絕。

select — 從預定義清單中單選。需要 options 陣列,每個項目有 value(必填)和可選的 label 顯示名稱:

- name: status
type: select
options:
- value: to-read
label: To Read
- value: reading
- value: done

省略 label 時,預設等於 value

multi_select — 從預定義清單中多選。options 格式與 select 相同。屬性值為字串列表。單一字串值(例如 genres: fiction)會自動視為單元素列表(["fiction"])。

將 Object 連結到另一個 Object。targetbidirectionalinversemultiple 欄位的詳細說明,請參閱 Relation 頁面。

- name: author
type: relation
target: person
bidirectional: true
inverse: books

除了 nametype 之外,屬性還支援可選的附加設定:

設定型別說明
emojistring簡潔顯示用的視覺圖示(在同一 type 內必須唯一)
descriptionstring屬性用途的自由文字說明
pininteger正整數,讓屬性突出顯示在 TUI 屬性面板頂端。數值越小排越前面。釘選屬性排在未釘選屬性之前,並以水平分隔線區隔。
defaultany建立新 object 時指定的預設值

為什麼需要 emoji? 在緊湊的 UI 環境中(TUI 屬性面板、表格欄位),屬性名稱會佔用大量水平空間。Emoji 提供空間效率高的視覺識別,一眼就能辨認。

為什麼需要 pin? 沒有置頂功能時,所有屬性在 Properties 面板中平等顯示。使用者必須掃描整個列表才能找到 status 或 rating 等關鍵中繼資料。置頂讓 type 作者標記特定屬性,突出顯示在 Properties 面板頂端,並以分隔線與其餘屬性區隔。

- name: status
type: select
emoji: 📋
pin: 1
options:
- value: to-read
- value: reading
- value: done

pin 值必須是正整數,且在同一 type schema 內唯一。沒有 pin(或 pin: 0)的屬性會照常顯示在 Properties 面板中。

當同一個屬性出現在多個 type 中,在每個 schema 中獨立定義會導致重複和不一致——projectdue_date 可能用 date 型別,而 task 的卻用了 datetime。共用屬性讓你定義一次、到處引用,確保跨 type 的定義一致。

如果同一個屬性出現在多個 type 中(例如 due_date 同時在 projecttask 裡),你可以在 properties/ 目錄中定義一次,然後用 use 關鍵字引用。

每個共用屬性是 properties/<name>.yaml 下的獨立檔案,其中 <name> 就是屬性名稱。不需要外層包裝鍵——檔案直接包含屬性定義。

properties/due_date.yaml
type: date
emoji: "\U0001F4C5"
properties/priority.yaml
type: select
options:
- value: high
- value: medium
- value: low

每個檔案支援與 type schema 屬性相同的所有欄位:typeemojipinoptionstargetdefaultmultiplebidirectionalinverse。在 type schema 中透過 use: 引用時,只有 pinemojidescription 可以被覆寫——其他欄位皆繼承自共用屬性定義。

properties/ 目錄為選填。如果該目錄不存在或沒有任何 .yaml 檔案,TypeMD 會將其視為空的共用屬性集合。

使用 use 關鍵字依名稱引用共用屬性:

types/project/schema.yaml
name: project
emoji: "\U0001F4CB"
properties:
- name: title
type: string
- use: due_date
- use: priority
- name: budget
type: number

載入 type 時,每個 use 項目會被解析為完整的屬性定義。你可以混合使用 use 項目和一般的屬性定義——順序會被保留。

透過 use 引用共用屬性時,你可以覆寫這些欄位:

欄位說明
pin覆寫此 type 中的置頂位置
emoji覆寫此 type 中的顯示 emoji
description覆寫此 type 的屬性說明

其他所有欄位不能覆寫——它們來自共用定義。

types/task/schema.yaml
name: task
properties:
- use: due_date
pin: 1
emoji: "\U0001F5D3\uFE0F"
- use: priority
共用屬性內嵌屬性
定義位置properties/<name>.yamltypes/<type>/schema.yaml
可重複使用是——透過 use 引用否——僅限單一 type
可依 type 自訂pinemojidescription完全可自訂
適用情境多個 type 共用的屬性單一 type 獨有的屬性

經驗法則:如果某個屬性以相同的定義出現在兩個以上的 type 中,就把它做成共用屬性。

  • Type — Type 如何定義 Object 結構
  • Relation — 連結 Object
  • 驗證 — 屬性值如何被驗證