作者:Professional TypeScript Training by Matt Pocock | Total TypeScript

模板字符串高级使用

强制字符串类型模式

模板文字可以将其他类型插入到字符串类型中,从而强制它们匹配特定的模式。

这里我们将创建一个PngFile类型,表示以“.png”结尾的字符串:

type PngFile = ` ${ string } .png` ;

现在,当我们输入一个新变量作为PngFile时,它​​必须以“.png”结尾:

let myImage : PngFile = "my-image.png" ;

当字符串与PngFile类型中定义的模式不匹配时,TypeScript 将显示错误:

type PngFile = ` ${ string } .png` ; let myImage : PngFile = "my-image.jpg" ; // red squiggly line under myImage // hovering over myImage shows: Type '"my-image.jpg"' is not assignable to type '`${string}.png`' .

该技术的另一个应用是确保字符串以某个前缀开头,比如要求路由以/开头:

type Route = `/ ${ string } ` ; const myRoute : Route = "/home" ; const badRoute : Route = "home" ; // red squiggly line under badRoute // hovering over badRoute shows: Error : Type '"home"' is not assignable to type '`/${string}`' .

您还可以指定字符串必须包含某个子字符串,例如要求字符串包含?才能被视为查询字符串:

type QueryString = ` ${ string } ? ${ string } ` ; const myQueryString : QueryString = "search?query=hello" ; const badQueryString : QueryString = "search" ; // red squiggly line under badQueryString // hovering over badQueryString shows: Error : Type '"search"' is not assignable to type '`${string}?${string}`' .

巧妙使用字符串模板可以帮助减少重复!

将模板文字类型与联合类型组合

模板文字字符串的常见模式是将其与联合类型一起使用。通过将联合传递给模板文字类型,您可以生成一个表示联合所有可能组合的类型。

例如,假设我们有一组颜色,每种颜色可能的色调从100900 :

type ColorShade = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 ; 
type Color = "red" | "blue" | "green" ;

如果我们想要所有可能的颜色和色调的组合,我们可以使用模板文字类型来生成新类型:

type ColorPalette = ` ${Color} - ${ColorShade} ` ;

现在, ColorPalette将表示颜色和色调的所有可能组合:

type ColorShade = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 ; 
type Color = "red" | "blue" | "green" ; 
type ColorPalette = ` ${Color} - ${ColorShade} ` ; 
let color : ColorPalette = "red-500" ; 
let badColor : ColorPalette = "red" ; // red squiggly line under badColor // hovering over badColor shows: Error : Type '"red"' is not assignable to type '`${Color}-${ColorShade}`' .

一共有 27 种可能的组合——三种颜色乘以九种色调。