Skip to main content

wrdn-effect-value-inferred-types

Replace duplicated object API types with types inferred from the runtime value or factory that owns the shape. Use when lint or review flags an interface/type alias that mirrors a returned object such as a plugin extension, client surface, route map, or handler table.

소스 정보

저장소
UsefulSoftwareCo/executor
최근 소스 활동
2026년 5월 5일 23:06
감지된 SKILL.md 언어
영어
스타
4,000
포크
336

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
wrdn-effect-value-inferred-types
description
Replace duplicated object API types with types inferred from the runtime value or factory that owns the shape. Use when lint or review flags an interface/type alias that mirrors a returned object such as a plugin extension, client surface, route map, or handler table.
allowed-tools
Read Grep Glob Bash
You fix one pattern: a TypeScript object type manually mirrors a runtime object that already owns the shape. Prefer value-first APIs. Build the object in a named factory, then export `type X = ReturnType<typeof makeX>`. Consumers keep importing the stable type name, but the type cannot drift from the implementation. ## Trace before changing 1. **Find the source value.** Look for an object returned from a named factory, `extension: (...) => ({ ... })`, a client object, route map, or handler table. 2. **Find the duplicate type.** A nearby `interface X` or `type X = { ... }` repeats the object methods/properties. 3. **Check whether the value is the source of truth.** If the interface is a contract with multiple implementations, keep the interface. 4. **Preserve the exported type name.** Replace its definition with `ReturnType<typeof makeX>` and update callers only if needed. 5. **Use `satisfies` only at boundaries.** Do not make the implementation satisfy a duplicate shape that could drift. ## Fix shape ```ts const makePluginExtension = (ctx: PluginCtx<Store>) => { const addSource = ... const removeSource = ... return { addSource, removeSource, }; }; export type PluginExtension = ReturnType<typeof makePluginExtension>; ``` For factories that need options: ```ts const makePluginExtension = (options: PluginOptions) => (ctx: PluginCtx<Store>) => ({ addSource: ..., }); export type PluginExtension = ReturnType<ReturnType<typeof makePluginExtension>>; ``` ## Bad ```ts export interface McpPluginExtension { readonly addSource: (config: McpSourceConfig) => Effect.Effect<AddResult, Failure>; readonly removeSource: (namespace: string, scope: string) => Effect.Effect<void, Failure>; } extension: (ctx) => { return { addSource, removeSource, } satisfies McpPluginExtension; }; ``` ## Good ```ts const makeMcpPluginExtension = (ctx: PluginCtx<McpStore>) => { return { addSource, removeSource, }; }; export type McpPluginExtension = ReturnType<typeof makeMcpPluginExtension>; extension: makeMcpPluginExtension; ``` ## What not to report - Service/dependency interfaces with multiple implementations. - Public config input types that are intentionally a stable authored API. - Branded IDs, discriminated unions, or small aliases that do not mirror one object value. - Test fakes typed against an existing exported contract. - Schema-owned data shapes; use `wrdn-effect-schema-inferred-types` for those. ## Output requirements When reviewing, report: - **File and line** of the duplicate object type or `satisfies` usage. - **Value/factory** that owns the shape. - **Why** the manual type can drift. - **Fix**: the exact `ReturnType` alias to introduce. When editing, name the factory after the exported type, e.g. `makeMcpPluginExtension` for `McpPluginExtension`.
GitHub에서 보기