You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript中创建可单向赋值给string的自定义类型别名

实现方案:使用TS branded类型(类型标记)

你当前的写法无法触发报错是因为TS默认是结构类型系统,直接给string起别名的话,ISOString和普通string在TS看来是完全等价的类型。
你要的「ISOString可赋值给string,反过来不行」的效果可以用branded类型实现,这种方案完全不会改变运行时的实际值(还是普通字符串),不会影响数据库存储,符合你的要求。

具体代码实现

首先定义带标记的ISOString类型:

// 给string类型加一个仅编译层面存在的唯一标记,不影响运行时值
type ISOString = string & { __brand: 'ISOString' }

你可以选择两种方式生成ISOString类型的值:

  • 直接类型断言,适合你已经确认字符串是合法ISO格式的场景
const isoString: ISOString = "2021-09-07T11:57:25.914Z" as ISOString
  • 带运行时校验的工具函数,更安全,避免传入非法ISO格式的字符串
function isISOString(val: string): val is ISOString {
  // 这里可以写你需要的ISO格式校验逻辑,比如正则或者Date解析校验
  return !isNaN(Date.parse(val)) && val.endsWith('Z')
}

function toISOString(date: Date): ISOString {
  return date.toISOString() as ISOString
}

效果测试

const str: string = "Just a string"

// ✅ 正常赋值:ISOString可以赋值给普通string
const normalStr: string = isoString
// ❌ TS编译报错:Type 'string' is not assignable to type 'ISOString'
const isoString2: ISOString = str

原理说明:branded类型是TS中实现名义类型的常用技巧,附加的__brand属性仅在TS编译校验时存在,运行时不会真的生成这个属性,所以变量的值还是普通字符串,完全不影响序列化、数据库存储等逻辑。

内容的提问来源于stack exchange,提问作者Caveman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:48:03