Giter Club home page Giter Club logo

Comments (10)

markusjohnsson avatar markusjohnsson commented on September 27, 2024

Another example:

type NumericValue = { kind: 'number'; value: number; };
type StringValue = { kind: 'string'; value: string; };
type Val = NumericValue | StringValue;

type JsVal<T extends Val> = T["value"];

function f1<T extends Val>(): JsVal<T> {
    return 123;
}

function f2<T extends Val>(obj: T): JsVal<T> {
    return 123;
}

const o: Val = { kind: "string", value: "hello" };
const s1: string = f1();  // Error!
const s2: string = f2(o); // No error!

from typescript.

RyanCavanaugh avatar RyanCavanaugh commented on September 27, 2024

JsVal<T> in this position doesn't stay deferred since T["value"] will go to the constraint; it's the same as string | number. You'd want to write it instead as

type JsVal<T extends Val> = T extends { value: infer U } ? U :never;
function myFunction<T extends Val>(obj: T): JsVal<T> {
    const v: JsVal<T> = 123; // is error
    return "ok"; // is error
}

I'm not getting why the second repro is supposed to be a defect.

from typescript.

markusjohnsson avatar markusjohnsson commented on September 27, 2024

@RyanCavanaugh

I'm not getting why the second repro is supposed to be a defect.

Well, obj.value = 123; can cause obj to be { kind: "string", value: 123 }, which is neither a NumericValue nor a StringValue, which makes it not Val, which in turn makes it not T, right?

from typescript.

RyanCavanaugh avatar RyanCavanaugh commented on September 27, 2024

The second repro (#59862 (comment)) doesn't contain the line obj.value = 123

from typescript.

markusjohnsson avatar markusjohnsson commented on September 27, 2024

Sorry, I thought you meant the second line in the first code.

The issue with #59862 (comment) is that s2 will have the value 123 but type string, but typescript does not complain about it:

https://www.typescriptlang.org/play/?#code/C4TwDgpgBAcgrgWwgJwJYGMBqBDANnaAXigG8oBrVAOwBMAuKAcisQCMVGBuKANzwIYsE7ZNwC+nAFChIUAMrA0VAOY58RUhWr0mAZ0XVlXXvwgN9S5eKkzoaqMXhI0WU1AA+8gyrUEp08GgAKV01AB4AFSgIAA9gCFpdKDUAPgcoCIBtACI+dWyAXX8AMzgqdGBUAHsqKGKARkjouISaJNSACgBKBhDwiLSSSSgRqGQIYDhkWvqAJgBmKTFJSVLyypq62abY+MTkvBSOqtYAKwYInqg+vEjB4dHxyemoOcXJZcl0Gv0oKoZ7MQyJRaAxshZDNkADQmdRggAWEFwuCq2SgEi+P2AUF09XM3mU6Qa3W4UAA9GSoABRZDIKrIACEmKov10s3xliJs2OXW4FNgVWitPpTO+LKquAgADoUcoOmzeeTKZkADIAeQA4gUGG8oJIgA

from typescript.

markusjohnsson avatar markusjohnsson commented on September 27, 2024

@RyanCavanaugh thank you for clarifying that T["value"] will not work in this case.

However, with all occurrences of JsVal removed, I think this should produce an error:

type NumericValue = { kind: 'number'; value: number; };
type StringValue = { kind: 'string'; value: string; };
type Val = NumericValue | StringValue;

function myFunction<T extends Val>(obj: T) {
    obj.value = 123;         // should error (?)
}

const o: Val = { kind: "string", value: "hello" };
myFunction(o);                // OR this assignment should error
type T = (typeof o)["value"]; // string
console.log(o.value);         // [LOG]: 123

https://www.typescriptlang.org/play/?ts=5.7.0-dev.20240904#code/C4TwDgpgBAcgrgWwgJwJYGMBqBDANnaAXigG8oBrVAOwBMAuKAcisQCMVGBuKANzwIYsE7ZNwC+nAFChIUAMrA0VAOY58RUhWr0mAZ0XVlXXvwgN9S5eKkzoaqMXhI0WU1AA+8gyrUEpkgDM4KnRgVAB7KigEEAAxYNCIqgAeABUoCAAPYAhaXSg1AD4ACnDWACsGVIBKUkkoBqgy8oA6PnUHKABGACYAZm5GoagAehGoXQALcLhcGgzkZHDkKGKAfmrJMUlJdEj9JoZ7YjJKWgYAIgtDC4AaE3VLyYhcXHCLqAlJGPiQsMjStVBsMQY0xlAAPIAJSgwEmqHy2F0ulQyioSCowAm01m8xQS2Q0nA0HSxGKtnCASa1QA2hd2gQLgBdbjg64qXb7cK4CAtN7KUptUxA0ENcE0gAyEIA4kyGL0+pIgA

EDIT: added "removed"

from typescript.

RyanCavanaugh avatar RyanCavanaugh commented on September 27, 2024

Property writes in general aren't sound whenever you're aliasing something. It's the same situation as this one:

type NumericValue = { kind: 'number'; value: number; };
type StringValue = { kind: 'string'; value: string; };
type Val = NumericValue | StringValue;
function myFunction(obj: Val) {
    obj.value = 123;
}

from typescript.

markusjohnsson avatar markusjohnsson commented on September 27, 2024

@RyanCavanaugh That's surprising. I guess I should stick to immutable objects. Thank you for taking your time and explaining.

from typescript.

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

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

from typescript.

markusjohnsson avatar markusjohnsson commented on September 27, 2024

This is still weird to me (v5.6.2, v5.7.0-dev.20240922):

type NumericValue = { kind: 'number'; value: number; };
type StringValue = { kind: 'string'; value: string; };
type Val = NumericValue | StringValue;

type R1 = number | string;
type R2<T extends Val> = T["value"];

function f1(): R1 {
    return 123;
}

function f2(obj: Val): R1 {
    return 123;
}

function f3<T extends Val>(): R2<T> {
    return 123;
}

function f4<T extends Val>(obj: T): R2<T> {
    return 123;
}

const o: Val = { kind: "string", value: "hello" };

const s1: string = f1();  // Error!
const s2: string = f2(o); // Error!
const s3: string = f3();  // Error!
const s4: string = f4(o); // No error!

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.