为什么即使在严格模式下,TypeScript也不抱怨这一点
function test(firstName: string, lastName?: string): string {
return firstName + " " + lastName;
}
test('John');
与此无关
const str: string = '';
const num: object = {};
const result: string = str + num;
我不记得要在屏幕上显示“ 约翰未定义”或“ [对象对象] ”的情况。 是类型检查的全部要点应该捕获此类错误吗? (流程做到了)
答案 0 :(得分:1)
创建类型安全的可变参数函数为您进行串联。
concat(...strings: string[]): string {
var concatenated = "";
for (var i = 0; i < strings.length; i++) {
concatenated += strings[i];
}
return concatenated;
};
现在,在连接时,使用函数:
const str: string = '';
const num: object = {};
const result: string = concat(str, num); // throws error
答案 1 :(得分:1)
在 +运算符中,您不能这样做,因为它旨在支持混合类型,例如在表达式"Count: " + a.length()
中。
可以隐式(以+串联)将对象转换为字符串并进行控制。在现代JavaScript中,可能会如下所示:
let o = {};
o.toString = ()=> "two"
alert("one" + " " + o); // Displays "one two"
因此,实际上没有理由仅根据类型拒绝第二个示例。
对于第一个示例,从unknown
和null
到字符串的转换是在抽象ToString()操作中隐含和定义的,尽管我不确定它是否可以更改,但似乎{{3} }现在,肯定是使用 tslint 之类的工具进行标记的原因,但是它在ECMAScript中仍然是有效的操作。
答案 2 :(得分:0)
正如马丁约翰斯所说on a github issue regarding this topic
<块引用>我认为这更属于短绒领域。这不是 确实是类型错误,这只是不受欢迎的行为。
答案 3 :(得分:-2)
因为连接字符串和未定义的值是有效的。对于第二个示例,同样的问题。在JavaScript中,您可以'' + {}
(通常不会有太大用处)。
严格键入可防止出现示例中的lastName.length
之类的不安全访问。