Git Product home page Git Product logo

Comments (6)

Andarist avatar Andarist commented on September 27, 2024 1

This is a surprising result. I'm not entirely sure about this but I think it stems from the fact that interfaces can be augmented. So there is no actual guarantee that the inferred type will stay the same with code changes.

Type literals can't be augmented so type literals have "inferable indexes". If you take a look at the function signature of Object.entries you might see this kind of type:

type ObjectEntries = {
    <T>(o: {
        [s: string]: T;
    } | ArrayLike<T>): [string, T][];
    (o: {}): [string, any][];
}

As we see here... T can only be inferred from an index signature. So since interface types don't have one... ye, the type is not inferred there.

from typescript.

Oblarg avatar Oblarg commented on September 27, 2024

Remember that interfaces types are ostensibly nominal, not structural. If you want structural typing, stick to type.

TypeDoc has a handy @interface tag that lets you document structural types as if they were interfaces, which is a nice middle-ground.

from typescript.

Andarist avatar Andarist commented on September 27, 2024

I might be misreading what you are saying but in the TS type system both interfaces and types are usually compared structurally. Nominal types can be achieved using classes with private properties.

from typescript.

Oblarg avatar Oblarg commented on September 27, 2024

@Andarist They're compared structurally but during compilation, references to interfaces are treated nominally (rather than the entire structure being inlined) until a comparison occurs. This is a big difference and has a lot of downstream effects (e.g. in mouseover tooltip behavior). There are also some rules regarding intersections that apply only to interfaces to keep their behavior consistent with nominal typing.

from typescript.

jcalz avatar jcalz commented on September 27, 2024

This is a combination of #15300 with #38520.

(Calling interfaces "nominally typed" is confusing at best, so let's desist from doing that.)

from typescript.

typescript-bot avatar typescript-bot commented on September 27, 2024

This issue has been marked as "Duplicate" and has seen no recent activity. It has been automatically closed for house-keeping purposes.

from typescript.

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.