为什么没有打字稿显示以下示例的任何类型错误?
function fancyMethod({ option1 = true }: { option1?: boolean } = {}) {
console.log(option1);
}
fancyMethod("abc");
fancyMethod(false);
fancyMethod(42);
答案 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