错误 2339 与 ||和联合类型

Error 2339 With || and Union Types

我创建了一个示例代码块,它显示了 TypeScript 中的语法错误,但运行正常 JavaScript:TypeScript Sandbox

基本上,当我尝试使用 || (OR) 运算符来拼接一个可能是 undefined 的对象 属性 TypeScript 时,它说属性 不存在,我知道这也是我使用 ||.

的原因
class Person {
    name: string;
    job: string;
}

var person1:Person = {name: 'hi',   job: 'yes'};
var name = 'bye';

function showName(person1:Person | string ) {
    var personsName: string = person1.name || person1;

    document.write(personsName);
    document.write('<br />');
}

showName(person1);
showName(name);

输出完全符合我的预期:

hi
bye

但是,TypeScript 在 person1.name 上显示语法错误。为什么?执行此操作的正确 TypeScript 方法是什么?

您需要在表达式中断言类型,因为操作数是联合类型。即

 var personsName: string = (<Person>person1).name || <string>person1;

我推荐使用 type guard:

function showName(person1: Person | string) {
    var personsName = (typeof person1 === "string") ? person1 : person1.name;

    document.write(personsName);
    document.write('<br />');
}

请注意,当 person1null || undefined 时,此代码将引发错误,但原始代码也是如此。有很多不同的方法来处理这个问题,所以我会把它留给你。