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

时间:2018-06-28 19:55:23

标签: javascript typescript

我正在将一些JS代码迁移到TS,并且面临着区分TypeScript中的空类型与仅给出对象中字段的空值之间的问题。

这是一个虚拟的例子:

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

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

    ...
}

就JS而言,以上代码有效。但是,当我合并TS时,我得到一个错误,说Type 'Default name' is not assignable to type 'null'。这样做似乎是因为现在TS将name : null解释为说name的类型为null,这不是我想要的。我只想将其初始化为null。

如何解决我的问题?

2 个答案:

答案 0 :(得分:2)

您可以告诉打字稿name应该是字符串。

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

拥有一个Person界面会更好。

interace Person {
    name: string;
    birthdate: Date;
}
let newPerson: Person = { 
    name: null, 
    birthdate: null 
};

答案 1 :(得分:1)

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传递给定义为字符串的属性。那是一件好事,您不想看到任何“无法读取null的属性'length'的错误”错误消息。