Skip to content

scope.import() causes circular type inference when imported definitions participate in ArkEnv.meta augmentationΒ #1644

Description

@karolrybak

Report a bug

πŸ”Ž Search Terms

ArkEnv, scope import

🧩 Context

"arktype": "2.2.1",
"@ark/schema": "0.56.0"
"typescript": "^6.0.3"

πŸ§‘β€πŸ’» Repro

Playground Link: https://arktype.io/playground?code=import%2520%257B%2520scope%2520%257D%2520from%2520%2522arktype%2522%250A%250Aexport%2520const%2520baseMeta%2520%253D%2520scope%28%257B%250A%2520%2520%2520%2520BaseMeta%253A%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520%2522description%253F%2522%253A%2520%2522string%2522%252C%250A%2520%2520%2520%2520%257D%250A%257D%29%253B%250A%250A%252F%252F%252F%2520Method%2520%25231%253A%2520import%2520%250Aconst%2520binaryMeta1%2520%253D%2520scope%28%257B%250A%2520%2520%2520%2520...baseMeta.import%28%29%252C%250A%2520%2520%2520%2520Binary%253A%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520%2522...%2522%253A%2520%2522BaseMeta%2522%252C%250A%2520%2520%2520%2520%2520%2520%2520%2520popKind%253A%2520%2522%27binary%27%2522%252C%250A%2520%2520%2520%2520%257D%252C%250A%2520%2520%2520%2520Bitwise%253A%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520%2522...%2522%253A%2520%2522Binary%2522%252C%250A%2520%2520%2520%2520%2520%2520%2520%2520popKind%253A%2520%2522%27bitwise%27%2522%252C%250A%2520%2520%2520%2520%257D%252C%250A%2520%2520%2520%2520ArkMeta%253A%2520%2522Binary%2520%257C%2520Bitwise%2522%250A%257D%29.export%28%29%253B%250A%250A%252F%252F%2520Method%2520%25232%253A%2520inline%250Aconst%2520binaryMeta2%2520%253D%2520scope%28%257B%250A%2520%2520%2520%2520BaseMeta%253A%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520%2522description%253F%2522%253A%2520%2522string%2522%252C%250A%2520%2520%2520%2520%257D%252C%250A%2520%2520%2520%2520Binary%253A%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520%2522...%2522%253A%2520%2522BaseMeta%2522%252C%250A%2520%2520%2520%2520%2520%2520%2520%2520popKind%253A%2520%2522%27binary%27%2522%252C%250A%2520%2520%2520%2520%257D%252C%250A%2520%2520%2520%2520Bitwise%253A%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520%2522...%2522%253A%2520%2522Binary%2522%252C%250A%2520%2520%2520%2520%2520%2520%2520%2520popKind%253A%2520%2522%27bitwise%27%2522%252C%250A%2520%2520%2520%2520%257D%252C%250A%2520%2520%2520%2520ArkMeta%253A%2520%2522Binary%2520%257C%2520Bitwise%2522%250A%257D%29.export%28%29%253B%250A%250Aexport%2520const%2520ArkMeta1%2520%253D%2520binaryMeta1.ArkMeta%253B%250Atype%2520ArkMeta1%2520%253D%2520typeof%2520ArkMeta1.infer%253B%250A%250Aexport%2520const%2520ArkMeta2%2520%253D%2520binaryMeta2.ArkMeta%253B%250Atype%2520ArkMeta2%2520%253D%2520typeof%2520ArkMeta2.infer%253B%250A%250A%250A%252F%252F%2520This%2520causes%2520error%253A%2520Return%2520type%2520annotation%2520circularly%2520references%2520itself%2520ts%282577%29%250Adeclare%2520global%2520%257B%250A%2520%2520%2520%2520interface%2520ArkEnv%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520meta%28%29%253A%2520ArkMeta1%250A%2520%2520%2520%2520%257D%250A%257D%250A%250A%252F%252F%2520%252F%252F%2520This%2520is%2520fine%253A%2520%250Adeclare%2520global%2520%257B%250A%2520%2520%2520%2520interface%2520ArkEnv%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520meta%28%29%253A%2520ArkMeta2%250A%2520%2520%2520%2520%257D%250A%257D%250A

import { scope } from "arktype"

export const baseMeta = scope({
    BaseMeta: {
        "description?": "string",
    }
});

/// Method #1: import 
const binaryMeta1 = scope({
    ...baseMeta.import(),
    Binary: {
        "...": "BaseMeta",
        popKind: "'binary'",
    },
    Bitwise: {
        "...": "Binary",
        popKind: "'bitwise'",
    },
    ArkMeta: "Binary | Bitwise"
}).export();

// Method #2: inline
const binaryMeta2 = scope({
    BaseMeta: {
        "description?": "string",
    },
    Binary: {
        "...": "BaseMeta",
        popKind: "'binary'",
    },
    Bitwise: {
        "...": "Binary",
        popKind: "'bitwise'",
    },
    ArkMeta: "Binary | Bitwise"
}).export();

export const ArkMeta1 = binaryMeta1.ArkMeta;
type ArkMeta1 = typeof ArkMeta1.infer;

export const ArkMeta2 = binaryMeta2.ArkMeta;
type ArkMeta2 = typeof ArkMeta2.infer;


// This causes error: Return type annotation circularly references itself ts(2577)
declare global {
    interface ArkEnv {
        meta(): ArkMeta1
    }
}

// // This is fine: 
declare global {
    interface ArkEnv {
        meta(): ArkMeta2
    }
}

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

Status
To do

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions