Comments (10)
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.
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.
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.
The second repro (#59862 (comment)) doesn't contain the line obj.value = 123
from typescript.
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:
from typescript.
@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
EDIT: added "removed"
from typescript.
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.
@RyanCavanaugh That's surprising. I guess I should stick to immutable objects. Thank you for taking your time and explaining.
from typescript.
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.
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)
- Property 'difference' does not exist on type 'Set' HOT 3
- Type narrowing of condition leads to unexpected error for assignment HOT 3
- Increase the distinction between class and interface properties when defining a class or interface
- Add adaptation to class and interface property prompts HOT 1
- Weird behavior with recursive generic types HOT 2
- Array of unions changed to union of arrays in conditional type HOT 4
- tsserver requires `npm` to be installed on `neovim` trough `mason` HOT 2
- RangeError: Maximum call stack size exceeded when calling `getJsDocTags` on getter of class that implements itself
- Class constructors that early return another object still require fields to be assigned HOT 2
- [NewErrors] 5.7.0-dev.20240922 vs 5.6.2 HOT 6
- [ServerErrors][JavaScript] 5.7.0-dev.20240922 vs 5.6.2 HOT 3
- [ServerErrors][TypeScript] 5.7.0-dev.20240922 vs 5.6.2 HOT 7
- IsolatedDeclarations: emitted declarations inconsistent between `transpileDeclaration` API and TypeScript Playground HOT 1
- Inconsistent typechecking with require() in JS and TS HOT 5
- TypeScript fails to narrow union of native Error types HOT 5
- Typed JSON imports HOT 3
- Proposal: Expand `inferFromTypeArguments()` candidates to include heritage elements HOT 1
- `ReadonlySet` and `ReadonlyMap` are lacking `Symbol.toStringTag`
- Wrong type is generated by typescript HOT 6
- wrong type ordering generated by `tsc`? HOT 9
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from typescript.