如何让打字稿在联合上的字符串插值中更加具体

问题描述 投票:0回答:1
export const schedules = [
    { unit: "hour", quantity: 6 },
    { unit: "day", quantity: 1 },
] as const;

const getScheduleName = (schedule: (typeof schedules)[number]) =>
    `${schedule.quantity}_${schedule.unit}` as const

为什么 getScheduleName 的返回类型是

"6_hour" | "6_day" | "1_hour" | "1_day"
而不是
"6_hour" | "1_day"
? 在这种情况下,有什么方法可以使打字稿更加具体吗?

typescript union-types
1个回答
0
投票

在为模板文字生成可能的值时,TS 似乎没有考虑可区分的联合。可能是一个限制,可能只是一个错误,可能值得向 TypeScripts github 页面提交问题。

我能想到的解决方法是将其转换为应有的样子:


export const schedules = [
    { unit: "hour", quantity: 6 },
    { unit: "day", quantity: 1 },
] as const;

type Schedule = (typeof schedules)[number]

const getScheduleName = <T extends Schedule>(schedule: T) =>
    `${schedule.quantity}_${schedule.unit}` as `${T["quantity"]}_${T["unit"]}`
    
let result = getScheduleName({ unit: "hour", quantity: 6 })

游乐场

强制转换并不安全,你基本上会沉默 TS 编译器,所以我通常会尝试将所有强制转换隔离为简单函数并用单元测试覆盖它们,因为其他人可以过来更改输出,而 TS 不会抱怨。

const getScheduleName = <T extends Schedule>(schedule: T) =>
    `${schedule.quantity} ==> ${schedule.unit}` as `${T["quantity"]}_${T["unit"]}` // no error
© www.soinside.com 2019 - 2024. All rights reserved.