【问题标题】:how to force typecasting in typescript DTO如何在打字稿 DTO 中强制进行类型转换
【发布时间】:2021-07-20 22:48:35
【问题描述】:

我试图让强制类型转换在打字稿中工作。我记得过去我做了类似下面的例子,但它似乎不起作用,我不确定它是因为打字稿的版本还是什么等等。在下面的例子中,我如何强制对下面的例子进行类型转换:

class UserDto {
    name: string;
    email: string;
    id: () => number; // before this used to work
}

let req = {
    name: 'John Doe',
    email: 'email@email.com',
    id: '10',
};

let res: UserDto  = req;

console.log(res);

错误:

Type 'string' is not assignable to type '() => number'.

------------------ 更新 - 让目标更清晰一点-------------

假设我有一个这样的发布请求:

{
    "userId": "10",
    "name": "John",
    "address": {
         "line1": "some road"
     }
}

DTO 看起来像这样:

(interface | class) AddressDTO {
     line1: string;
}

(interface | class) UserDTO {
     userId: number;
     name: string;
     address: AddressDTO;
}

然后当我们拦截请求并将数据传递到系统的另一部分时,我们会执行类似的操作。 (这是我之前肯定做过的工作,但找不到来源,因为我花了很长时间才让它工作。我虽然是 'id: "() =>" number' 部分强制转换为数字)

想要的结果:

let req = {
   "userId": "10",
   "name": "John",
   "address": {
       "line1": "some road"
    } 
};

let postData: UserDTO = req;

// output is as follow:
{
   "userId": 10, // here it's force cast to number
   "name": "John",
   "address": AddressDTO (set to: "line1": "some road")
};

【问题讨论】:

  • 您在寻找let res = req as unknown as UserDto; 吗?
  • 我尝试了两种变体。我得到同样的错误
  • 为什么要把id做成字符串,而在类里却是函数呢?
  • 没有我试图创建一个 DTO,我只是分配 let dto = request.params;。或类似的东西。但我遇到的问题是,当 url 参数被发送时,它抱怨我不能将 id 设置为数字,因为参数是一个字符串。我将它作为 () => number 的唯一原因是这是我让它强制将字符串 id 强制类型转换为过去的数字的唯一方法。据我所知,它是我使用的一个“类”,但它可能是一个接口等我真的不知道。

标签: typescript types casting


【解决方案1】:

您会收到编译错误,因为'10' 是一个字符串,而不是返回数字的函数 ( () => number)

您可以通过允许字符串来解决这个问题,例如。

class UserDto {
    name: string;
    email: string;
    string | id: () => number; // allow both
}

但不确定这是否是您要寻找的地方。将匿名类型转换为类(例如 UserDto)有点棘手,请参阅How do I cast a JSON Object to a TypeScript class?

还请注意as(或旧的<AnotherType> 语法)不是演员表。这是一个类型断言,基本上说,“编译器我比你更了解类型。”。见Learning TypeScript - Casting Types

【讨论】:

  • 您好。谢谢您的帮助。我将更新我的问题以使其更清晰。实际上,我已经在另一个示例中进行了此操作,不幸的是,它已被永久删除,并且无法弄清楚如何再次执行此操作。
  • 好的,谢谢。那里肯定有一些看起来可以工作的答案。我会处理它并回复你。
  • 我不得不暂时放下这个,因为我正忙于完成项目的其他元素。但我很快就会想出一个解决方案。所以当我有工作时我会更新我的问题。
猜你喜欢
  • 2020-04-09
  • 2017-05-16
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
相关资源
最近更新 更多