TypeScript:当匿名对象属性不满足类型规范时强制类型错误

标签 typescript types

我有一个带有 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',
  }),
});

Playground

关于TypeScript:当匿名对象属性不满足类型规范时强制类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74032060/

相关文章:

typescript - 使用 Deno API 时出现 TSC 编译错误 (TS2307)

c++ - 获取宏中函数的返回类型(C++)

C++ : has_trivial_X type traits

java - 为什么基本类型有一个 "Class"以及它是如何使用的?

angular - 在 Angular 4 的多个模块中导入一个组件

typescript - 正确使用 Typescript .d.ts 文件

angular - fa 图标不随 ngClass 变化

typescript - 如何检查一个对象是否只包含 Typescript 中指定的键?

f# - 我可以在 .NET (F#) 上创建自己的文字类型吗?

c - 如何将一个 64 位数字拆分为八个 8 位值?