Code Monkey home page Code Monkey logo

Comments (7)

Qsppl avatar Qsppl commented on May 28, 2024

The same thing happens when assigning an identifier to a property with a model descriptor.

import { Model, ModelIdentifier, define, store } from "https://esm.sh/[email protected]"

export interface IModel {
    prop1: number
}

export const ModelStore: Model<IModel> = {
    id: true,
    prop1: 1
}

function setModelById(host: IComponent, id: ModelIdentifier) {
    host.model = id
}

export interface IComponent extends HTMLElement {
    model: IModel
}

export default define<IComponent>({
    tag: "a-component",
    model: store(ModelStore, { draft: true }),
})

image

message:

Type 'ModelIdentifier' is not assignable to type 'IModel'.
  Type 'undefined' is not assignable to type 'IModel'. ts(2322)

from hybrids.

smalluban avatar smalluban commented on May 28, 2024

I don't have time to check every TS error (from all of your issues) - can you confirm if the problem is solved by using TS v4?

FYI: #236 (comment)

from hybrids.

Qsppl avatar Qsppl commented on May 28, 2024

Typescript version: 4.9.5 did not solve these problems. This seems to be untyped implicit logic.

from hybrids.

Qsppl avatar Qsppl commented on May 28, 2024

Update: In the first case, this is my mistake. I should have written not

function submit(host: IComponent) {
    store.submit(host.draft)
    host.draft = undefined
}

but

function submit(host: Component<IComponent>) {
    store.submit(host.draft)
    host.draft = undefined
}

But the error from the second case does not disappear even after this fix:

import { Model, define, store, Component } from "https://esm.sh/[email protected]"

export interface IModel {
    id: number
    prop1: number
}

export const ModelStore: Model<IModel> = {
    id: true,
    prop1: 1
}

function setModelById(host: Component<IComponent>, id: number) {
    host.model = id
}

export interface IComponent extends HTMLElement {
    model: IModel
}

export default define<IComponent>({
    tag: "a-component",
    model: store(ModelStore, { draft: true }),
})

from hybrids.

smalluban avatar smalluban commented on May 28, 2024

This "was" a limitation of the TS itself, that the setter must accept the same type as a getter. I am sure, it was like this when I created definitions for TS.

Your type says:

model: IModel

But you are trying to set it to a number. As this is expected in hybrids, I am not sure if this is possible to define in TS.

EDIT: You can try with mode: IModel | number, but then you are opening many conditions when using that property, as TS claims that it might be also a number (which getting the value is not correct).

from hybrids.

Qsppl avatar Qsppl commented on May 28, 2024

Hid it in a helper function:

import { Model, define, store, Component } from "https://esm.sh/[email protected]"

function setModelDescriptorId<C extends Component<any>>(component: C, property: object) {
    let [key, value] = Object.entries(property)[0]
    /// @ts-ignore
    component[key] = value
}

export interface IModel {
    id: number
    prop1: number
}

export const ModelStore: Model<IModel> = {
    id: true,
    prop1: 1
}

function setModelById(host: Component<IComponent>, id: number) {
    setModelDescriptorId(host, { model: id })
}

export interface IComponent extends HTMLElement {
    model: IModel
}

export default define<IComponent>({
    tag: "a-component",
    model: store(ModelStore, { draft: true }),
})

But my typescript skills were not enough to write correct generics for this helper function.

from hybrids.

Qsppl avatar Qsppl commented on May 28, 2024

This "was" a limitation of the TS itself, that the setter must accept the same type as a getter. I am sure, it was like this when I created definitions for TS.

Different getters and setters for interfaces are now available, but it is unclear how current types based on "mapped types" can be rewritten as interfaces.

There is currently no way to use access options in mapped types. There is an open feature request for this at microsoft/TypeScript#43826. It's marked as "Waiting for More Feedback" which means they want to hear more community feedback in favor of it before considering the possibility of its implementation.
Could you write a comment there saying that this feature is necessary?

from hybrids.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.