Typescript函数默认参数分配和类型检查之间有什么区别?

时间:2018-11-08 23:51:08

标签: typescript

考虑以下功能

在以下内容中我会收获或失去什么

getFruits(checkInventory = true){
 if (checkInventory) {}
 ....
}

getFruits(checkInventory: boolean){
 if (checkInventory) {}
 ....
}

3 个答案:

答案 0 :(得分:2)

getFruits(checkInventory = true){
 if (checkInventory) {}
 ....
}

在这种情况下,您要为true参数分配默认的checkInventory值。因此,您可以调用getFruits方法而无需传递checkInventory参数:getFruits()。这与getFruits(true)相同。如果未将任何值传递给此参数,则编译器将使用方法声明中定义的默认值true

您仍然可以将任何类型的另一个值传递给checkInventory参数,因为它隐式定义为any类型,例如getFruits(123)getFruits("apple")

但是另一个呢?

getFruits(checkInventory: boolean){
 if (checkInventory) {}
 ....
}

您正在定义checkInventory参数的类型,而不是其值。现在,您只能将boolean值传递给checkInventory参数(您仍然可以将nullundefinedany类型的对象传递给该参数)。

您必须将任何boolean值传递给getFruits方法,例如getFruits(true)getFruits(false)。如果使用getFruits()getFruits('apple'),编译器将显示错误。

但是,如果您仍然尝试传递字符串或不提供任何值,则您的应用程序仍将运行而不会出现任何编译错误。 TypeScript只是为JavaScript提供静态类型检查,而JavaScript变量可以是任何类型的任何类型。

请注意,当您的应用运行且可能无法按预期读取或执行您传递的值时,可能会发生错误。

答案 1 :(得分:0)

您可以这样调用的第一个版本:getFruits()。这将等效于getFruits(false)

对于第二个版本,编译器将存在,您需要显式传递一个checkInventory值。

答案 2 :(得分:0)

对于

with t as (
      select v.*
      from (values (100, 'abc123'),
                   (200, 'def456'),
                   . . .
           ) v(id, column2)
     )
update t1
    set column2 = t.column2
    from dbo.table1 t1 join
         t
         on t1.id = t.id;

您正在设置getFruits(checkInventory = true){ if (checkInventory) {} .... } 的默认值

因此checkInventorycheckInventory()相同。当然,您可以通过传入另一个值checkInventory(true)来覆盖该值。

但是,在这种情况下,未定义参数类型,默认为checkInventory(true)。因此,您可以使用任何类型的参数来调用该函数。例如any

对于

checkInventory("string")

您正在定义参数的类型。它必须为getFruits(checkInventory: boolean){ if (checkInventory) {} .... } true。这种情况下没有默认值。

如果尝试像false那样调用此函数,则编译器将引发错误,因为它期望的类型为checkInventory("string"),但得到的是boolean