如何使TypeScript抱怨其他类型的字符串连接?

时间:2018-11-01 05:25:33

标签: javascript typescript typescript-typings

为什么即使在严格模式下,TypeScript也不抱怨这一点

function test(firstName: string, lastName?: string): string {
    return firstName + " " + lastName;
}

test('John');

与此无关

const str: string = '';
const num: object = {};

const result: string = str + num;

我不记得要在屏幕上显示“ 约翰未定义”或“ [对象对象] ”的情况。 是类型检查的全部要点应该捕获此类错误吗? (流程做到了)

4 个答案:

答案 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

Example here

答案 1 :(得分:1)

+运算符中,您不能这样做,因为它旨在支持混合类型,例如在表达式"Count: " + a.length()中。

可以隐式(以+串联)将对象转换为字符串并进行控制。在现代JavaScript中,可能会如下所示:

let o = {};
o.toString = ()=> "two"
alert("one" + " " + o); // Displays "one two"

因此,实际上没有理由仅根据类型拒绝第二个示例。

对于第一个示例,从unknownnull到字符串的转换是在抽象ToString()操作中隐含和定义的,尽管我不确定它是否可以更改,但似乎{{3} }现在,肯定是使用 tslint 之类的工具进行标记的原因,但是它在ECMAScript中仍然是有效的操作。

答案 2 :(得分:0)

正如马丁约翰斯所说on a github issue regarding this topic

<块引用>

我认为这更属于短绒领域。这不是 确实是类型错误,这只是不受欢迎的行为。

no-base-to-string

restrict-plus-operands

restrict-template-expressions

no-implicit-coercion

答案 3 :(得分:-2)

因为连接字符串和未定义的值是有效的。对于第二个示例,同样的问题。在JavaScript中,您可以'' + {}(通常不会有太大用处)。

严格键入可防止出现示例中的lastName.length之类的不安全访问。