在函数调用中声明对象的类型?

Declaring type of an object inside a function call?

在 TypeScript 中,我可以这样做:

function someFunction(options:any) {
    // Do something
}

interface MyOptions {
    userId: number;
    verbose: boolean;
}

const options: MyOptions = {
    userId: 12345,
    doesntExist: false, // Error
}

someFunction(options);

这会给我一个关于“doesntExist”的编译错误属性。

问题是当我在没有创建中间变量的情况下做同样的事情时:

someFunction({
    userId: 12345,
    doesntExist: false, // no error
});

在那种情况下,由于 someFunction 接受 any 作为参数,因此不强制执行类型检查。即使我这样做,编译器也不会抱怨:

someFunction({
    userId: 12345,
    doesntExist: false, // no error
} as MyOptions);

所以我想知道有没有什么方法可以在不创建中间变量的情况下强制执行类型检查?

What I was wondering is if there's a syntax that allows me to say "while the function takes 'any' as parameter, I declare that the object I'm passing is of type T"

您所描述的是generics

function someFunction<T>(options: T) {
  // Do something
}

如果您只是调用该函数而不指定泛型 T 那么您将不会收到错误消息,因为打字稿会假定 T 是您提供的任何参数的类型。

但您可以手动输入泛型 MyOptions,当您的参数不正确时,您会得到一个错误。

someFunction<MyOptions>({
  userId: 12345,
  doesntExist: false // error
})

这里我们得到错误Argument of type '{ userId: number;不存在:布尔值; }' 不可分配给 'MyOptions' 类型的参数。对象字面量只能指定已知属性,并且 'doesntExist' 不存在于 'MyOptions' 类型中。

Typescript Playground Link