Problem
In the code below, I want to make the property 'size' and 'fixSize' only one can be set.
interface Size {
size: number;
}
interface FixSize {
fixSize: number;
}
type Demo = Size | FixSize;
let a: Demo = {
size: 1,
fixSize: 1
}
Not so perfect solution
I use never to improve itγ Now, people who pass a value to Size cannot set 'size' and 'fixSize'. However, people who read value from Size will also can see fixSize and Size.
interface Size {
size: number;
fixSize?: never;
}
interface FixSize {
fixSize: number;
size?: never;
}
type Demo = Size | FixSize;
let a: Demo = { // ok, it errors
size: 1,
fixSize: 1
}
// however...
function sizeFn(a: Demo) {
if (isSize(a)) {
a.fixSize; // I don't want property 'fixSize' can be get.
a.size;
} else {
}
}
function isSize(a: Demo): a is Size {
return 'size' in a;
}