-
Notifications
You must be signed in to change notification settings - Fork 13.1k
Closed
Labels
Needs More InfoThe issue still hasn't been fully clarifiedThe issue still hasn't been fully clarified
Description
New behavior
No property existence check for object type.
let foo: object;
foo.bar; // no errorRationale
The current object type is useful when used to type function arguments but not very useful on object members. See this IDL:
[SecureContext]
interface PaymentResponse {
[Default] object toJSON();
readonly attribute DOMString requestId;
readonly attribute DOMString methodName;
readonly attribute object details;
readonly attribute PaymentAddress? shippingAddress;
readonly attribute DOMString? shippingOption;
readonly attribute DOMString? payerName;
readonly attribute DOMString? payerEmail;
readonly attribute DOMString? payerPhone;
Promise<void> complete(optional PaymentComplete result = "unknown");
};Here, the details member can be any "object" depending on payment method behavior. Current lib.d.ts defines this member as any so that a user can access any untyped members.
let response: PaymentResponse;
let { details } = response;
details.anImplementationDependentMemberName; // greatBut any means it can be boolean, number, string or even null or undefined.
if (typeof details === "number") {
// `details` is resolved as `number` but really should be `never` here
}
details++; // no error, :(A language service should be able to warn on these cases while still allowing arbitrary member accesses. Allowing such free accesses on object type will help here:
details.anImplementationDependentMemberName; // still great
if (typeof details === "number") {
// it cannot be a number, so `never` here
}
details++; // error now :DHey, a function can also be an object in TS!
Yes, but I don't think the fact will cause any problem as functions can also have arbitrary members. And I'm not proposing arbitrary function call.
Metadata
Metadata
Assignees
Labels
Needs More InfoThe issue still hasn't been fully clarifiedThe issue still hasn't been fully clarified