假设我有一些参数没有被输入(或者至少没有针对我的用例专门输入)的函数,以及我自己定义的一些接口

// f is some function from a JS library
const f = (x: any) => console.log(x);

interface SpecificObject {
    a: string;
    b: string;
}

我们可以这样做:

const tmpVar: SpecificObject = {a: ""};
f(tmpVar);

编译器正确地给出了一个错误,因为它静态地看到我们的文本中缺少键b.

但这会创建一个不必要的临时变量tmpVar.如何在不使用额外变量的情况下获得相同类型的判断行为?

我try 过:

f({a: ""} as SpecificObject);

但这并不会给出错误.as似乎更像是一个强制类型断言,而不是像上面的变量类型那样进行判断的断言.

推荐答案

您可以使用the satisfies operator有点像类型安全的as.它不会不安全地缩小之前的表达的类型(尽管它提供了可能会影响其推断类型的context),因此如果它不满足相关类型,您将收到警告:

f({ a: "" } satisfies SpecificObject); // error!
//          ~~~~~~~~~
//   Property 'b' is missing in type '{ a: string; }'

f({ a: "", b: "" } satisfies SpecificObject); // okay

Playground link to code

Typescript相关问答推荐

如何根据数据类型动态注入组件?

Angular 17 -如何在for循环内创建一些加载?

对深度对象键/路径进行适当的智能感知和类型判断,作为函数参数,而不会触发递归类型限制器

webpack错误:模块找不到.当使用我的其他库时,

如何通过TypeScript中的工厂函数将区分的联合映射到具体的类型(如类)?

使用打字Angular 中的通用数据创建状态管理

我可以以这样一种方式键入对象,只允许它的键作为它的值吗?

FatalError:Error TS6046:';--模块分辨率';选项的参数必须是:'; node ';,'; node 16';,'; node

Angular 自定义验证控件未获得表单值

我可以使用typeof来强制执行某些字符串吗

如何将类似数组的对象(字符串::匹配结果)转换为类型脚本中的数组?

Angular 16将独立组件作为对话框加载,而不进行布线或预加载

TypeScrip-如何自动推断UNION变量的类型

如何键入派生类的实例方法,以便它调用另一个实例方法?

如何在TypeScrip中使用数组作为字符串的封闭列表?

T的typeof键的Typescript定义

为什么我会得到一个;并不是所有的代码路径都返回一个值0;switch 中的所有情况何时返回或抛出?(来自vsCode/TypeScript)

可以';t使用t正确地索引对象;联合;索引类型

Typescript:是否将联合类型传递给重载函数?

在 next.js 13.4 中为react-email-editor使用forwardRef和next/dynamic的正确方法