Самый простой способ изменить свойство с необязательного на обязательное - это пересечь исходный интерфейс с типом, в котором свойство содержит только это свойство, но является обязательным. Вы можете легко создать такой тип, используя Required
и Pick
:
declare const obj2: Test & Required<Pick<Test, 'bar'>>;
obj2.bar.name // bar is required so this is ok
Playground Link
Также обратите внимание, что если ваша функция изменяет существующий объект, вы можете использовать утверждение пользовательского типа для изменения исходного типа:
const obj: Test = { foo: 0}
let a = obj.bar // a is { name: string; } | undefined
obj.bar.name // err
function doSomething(o: Test): asserts o is Test & Required<Pick<Test, 'bar'>> {
o.bar = { name: ""}
}
doSomething(obj)
obj.bar.name // ok
Playground Link
Вы также можете создать функцию, которая добавляет bar
, но тип необходимо утверждение:
function addBar(o: Test) {
o.bar = { name: "" }
return o as Test & Required<Pick<Test, 'bar'>> ;
}
let obj = addBar({ foo: 0 });
obj.bar.name;
Playground Link