Ember-cli-typescript: How to specify self-referencing models (e.g. parent-child)?

Created on 18 Oct 2018  路  2Comments  路  Source: typed-ember/ember-cli-typescript

Used versions

ember-cli: 3.5.0
node: 8.12.0
os: win32 x64
tsc: 3.1.3
Reproduction Case
#app/models/node.ts

import DS from 'ember-data';

export default class Node extends DS.Model.extend({
    name: DS.attr(),
    parent: DS.belongsTo('node', { inverse: "children" }),
    children: DS.hasMany('node', { inverse: "parent" }),
}) {
}

declare module 'ember-data/types/registries/model' {
    export default interface ModelRegistry {
        'node': Node;
    }
}

Now about that bug. What did you expect to see?

Self-referencing models should work, maybe specified differently?

What happened instead?

app/models/node.ts(3,22): error TS2506: 'Node' is referenced directly or indirectly in its own base expression.

Most helpful comment

Thank you, @Bouke, for both opening this issue and documenting a solution here so other people who search will find it! 馃槏

All 2 comments

Discussing this on discord, this issue was resolved by using ember-decorators like this:

import { attr, belongsTo, hasMany } from '@ember-decorators/data';

export default class Node extends DS.Model {
    @belongsTo('node', { inverse: 'children' }) parent!: DS.PromiseObject<Node> & Node;
    @hasMany('node', { inverse: 'parent' }) children!: DS.PromiseManyArray<Node>;
}

declare module 'ember-data/types/registries/model' {
    export default interface ModelRegistry {
        'node': Node;
    }
}

Thank you, @Bouke, for both opening this issue and documenting a solution here so other people who search will find it! 馃槏

Was this page helpful?
0 / 5 - 0 ratings