我有一个匿名对象,它具有TypeScript类型的属性。类似这样的东西:
type Foo = {
exists: true;
bar: string;
};
doSomething({
foo: {
exists: true,
bar: 'baz',
} as Foo,
});
我想键入保护foo
属性,所以如果类型Foo
在未来发生更改(例如获得新属性(,则TypeScript编译器会警告我。虽然这些会导致编译器错误:
doSomething({
foo: {
exists: 'string', // Incorrect type
bar: 'baz',
} as Foo
});
doSomething({
foo: {
say: 'hello', // Not enough overlap with Foo
bar: 'baz',
} as Foo
});
这不会导致类型错误,即使exists
丢失:
doSomething({
foo: {
bar: 'baz',
} as Foo
});
同样,这也不会导致类型错误:
doSomething({
foo: <Foo>{
bar: 'baz',
},
});
当Foo
的属性丢失时,我可以强制执行类型错误的唯一方法是:
const foo: {foo: Foo} = {
foo: {
bar: 'baz',
},
};
doSomething(foo);
但这需要我不必要地创建一个局部变量,仅仅是为了类型安全。有没有一种方法可以键入保护匿名对象的属性?
注意:doSomething()
的参数接受any
,不强制执行任何类型要求,否则我可以依赖doSomething
强制执行类型。
TypeScript 4.9将引入satisfies
运算符。
doSomething({
foo: {
bar: 'baz',
} satisfies Foo,
});
在此之前,您可以在编译时使用另一个函数来验证foo
。
const validFoo = (foo: Foo) => foo
doSomething({
foo: validFoo({
bar: 'baz',
}),
});
游乐场