Closed
Description
TypeScript Version: 2.4.1 and 2.6.0-rc
Code
{
type User = { name: string };
const logUser = (_user: User) => {};
type State = {
user: User | undefined;
};
const fn = function<Own extends {}>(p: Readonly<Own & State>) {
const { user } = p;
if (user !== undefined) {
// Unexpected error: Type 'undefined' is not assignable to type 'User'
// `user` should be narrowed to exclude `undefined` here.
logUser(user);
}
};
}
//
// KNOWN WORKAROUNDS
//
{
type User = { name: string };
const logUser = (_user: User) => {};
type State = {
user: User | undefined;
};
const fn = function<Own extends {}>(p: Own & State) {
const { user } = p;
if (user !== undefined) {
// No error when `Readonly` is dropped
logUser(user);
}
};
}
{
type User = { name: string };
const logUser = (_user: User) => {};
type State = {
user: User | undefined;
};
const fn = function<Own extends {}>(p: Readonly<Own & State>) {
const user: User | undefined = p.user;
if (user !== undefined) {
// No error when `user` is manually annotated
logUser(user);
}
};
}
{
type User = { name: string };
const logUser = (_user: User) => {};
type State = {
user: User | undefined;
};
type Own = {};
type P = Readonly<Own & State>
const p = {} as any as P;
const { user } = p;
if (user !== undefined) {
// No error if origin of `p` value and `Own` type is not from function
logUser(user);
}
}
Expected behavior:
(See comments in code.)