Typescript 与多种类型的接口

Typescript 与多种类型的接口,typescript,Typescript,我有一个接口属性: LegalReviewDate?: string | Date; 上载到SharePoint列表时,它需要是日期对象。我知道在提交之前它将是一个字符串,所以我尝试以下方法: contract.LegalReviewDate = new Date(contract.LegalReviewDate); 但这会引发错误,因为它不是字符串或数字(函数认为它可能是无效的日期) 有没有办法告诉函数“new Date”(新日期)它是一个字符串?有很多方法可以做到这一点 如果您完全确定在

我有一个
接口
属性:

LegalReviewDate?: string | Date;
上载到SharePoint列表时,它需要是
日期
对象。我知道在提交之前它将是一个字符串,所以我尝试以下方法:

contract.LegalReviewDate = new Date(contract.LegalReviewDate);
但这会引发错误,因为它不是
字符串
数字
(函数认为它可能是无效的
日期)


有没有办法告诉函数“new Date”(新日期)它是一个字符串?

有很多方法可以做到这一点

如果您完全确定在代码运行时,
contract.LegalReviewDate
的值是一个日期格式正确的字符串(有关跨浏览器支持的格式的更多信息,请参阅),则可以使用
as
运算符告诉TypeScript您对其有效性有信心:

contract.LegalReviewDate = new Date(contract.LegalReviewDate as string);
您还可以使用类型保护来确保您的假设是正确的:

if (typeof contract.LegalReviewDate === 'string') {
    contract.LegalReviewDate = new Date(contract.LegalReviewDate as string);
}
if (typeof contract.LegalReviewDate === 'object' && contract.LegalReviewDate instanceof Date) {
    contract.LegalReviewDate = contract.LegalReviewDate as Date;
    // OR contract.LegalReviewDate = new Date(contract.LegalReviewDate.valueOf());
}
或者正如@jcalz所提到的,使用两个单独的属性或对象。比如说,

interface Contract {
    LegalReviewDate?: string;
}

interface ContractDTO {
    LegalReviewDate?: Date;
}

然后,创建一个新的
contractedTo
,用于向SharePoint传递数据。

新日期(contract.LegalReviewDate作为字符串)
?如果是字符串,可以使用类型保护并将其转换为日期。您如何知道它是
字符串而不是
日期
?您是否为其分配了
字符串
?如果是这样的话,我们能看到代码吗?@jcalz在整个项目中除了uploadin之外,属性是一个字符串。我使用Office Fabric UI
DatePicker
,它返回一个我转换为字符串的
Date
。在上传时,我需要它是一个
日期
。您可能应该使用两个属性而不是一个,或者两个对象,其中一个具有
字符串
属性,另一个用于上传的对象具有
日期
属性。对来回变化的不同类型重用相同的属性很难使类型安全。如果您想使用像
as string
这样的断言来消除错误,这将是可行的,但我倾向于重构,因此这是不必要的。祝你好运