为什么没有打字稿检查选项参数?

时间:2017-06-08 08:05:44

标签: typescript

为什么没有打字稿显示以下示例的任何类型错误?

function fancyMethod({ option1 = true }: { option1?: boolean } = {}) {
    console.log(option1);
}

fancyMethod("abc");
fancyMethod(false);
fancyMethod(42);

Try it yourself using this Playground Link

2 个答案:

答案 0 :(得分:3)

因此fancyMethod的参数类型必须是一个对象,可选择一个布尔属性option1

您传入的所有参数都是没有option1属性的对象,但这是正常的,因为它是可选的,所以在每种情况下,您只需获得默认的option1 = true。 / p>

一个显示相同内容的简短示例:

let x: { option1?: boolean } = "abc";
x = 42;

字符串和数字都与所有属性都是可选的类型兼容。

但是,如果你现在尝试:

x = { foo: 1 };

你收到错误:

t.ts(11,7): error TS2322: Type '{ foo: number; }' is not assignable to type '{ option1?: boolean | undefined; }'.
  Object literal may only specify known properties, and 'foo' does not exist in type '{ option1?: boolean | undefined; }'.

因为如果您传入的属性不属于该类型的属性,则会进行额外的检查,如果您尝试将具有其他属性的对象文字传递给fancyMethod()

,则会发生同样的情况

答案 1 :(得分:2)

您可以通过将类型与object类型合并来强制TypeScript仅接受对象:

function fancyMethod({ option1 = true }: { option1?: boolean } & object = {}) {
    console.log(option1);
}

fancyMethod("abc");
fancyMethod(false);
fancyMethod(42);
fancyMethod({}); // no error