Javascript TypeScript-区分空类型和空对象值

Javascript TypeScript-区分空类型和空对象值,javascript,typescript,Javascript,Typescript,我正在将一些JS代码迁移到TS,并且我面临着一个问题,即区分TypeScript中的null类型和只在对象中给出字段的null值 下面是一个虚拟示例: export const performProcedure = () => { let newPerson = { name: null, birthdate: null } if (<someCheck>) { newPerson.name = "Def

我正在将一些JS代码迁移到TS,并且我面临着一个问题,即区分TypeScript中的null类型和只在对象中给出字段的null值

下面是一个虚拟示例:

export const performProcedure = () => {
    let newPerson = {
        name: null,
        birthdate: null
    }

    if (<someCheck>) {
        newPerson.name = "Default name";
    }

    ...
}
就JS而言,上面的代码是有效的。然而,当我合并TS时,我得到一个错误,指出类型“Default name”不可分配给类型“null”。它似乎是这样做的,因为现在TS将name:null解释为表示name的类型为null,这不是我想要的。我只想将它初始化为null


如何回避我的问题?

您可以告诉typescript名称应该是字符串

let newPerson = {
    name: <string>null,
    birthdate: null
}

Typescript解析了newPerson.name的类型为null,因为您将null放在那里。最好的办法是尽量具体。如果您希望允许空值和字符串,请创建一个这样的接口:

interace Person {
    name: string | null;
    birthdate: Date | null;
}

let newPerson: Person = { ... }
这是最明确的。可能更好的方法是使用undefined而不是null。然后,您可以仅使用可选参数:

interace Person {
    name?: string;
    birthdate?: Date;
}

值得注意的是,如果在tsconfig中启用所有严格检查,则不能将null传递给定义为string的属性。这是一件好事,您不希望看到任何不能读取null erro消息的属性'length'

真的有必要为此构建一个接口吗?在我的函数中,我只是尝试返回设置了适当值的newPerson对象。有时“生日”字段将是字符串,而其他时间,它可以为空。这可能吗?我的tsconfig.json已经打开了strictNullChecks。虽然没有必要,但它会有所帮助。我可能会将这段代码提取到一个像getPerson这样的方法中,这个方法需要一个返回类型。这将是个人界面。或者您可以使用条件三元运算符并写入:name:?默认名称:null。这一次,Typescript将把类型解析为字符串| null。
interace Person {
    name?: string;
    birthdate?: Date;
}