TypeScript:如何为标签模板字面量ExamplesTTL_ideal声明类型?
如何为ExamplesTTL_ideal声明类型替代any?
以下是你的现有代码:
interface Context { User: "OK" | "KO" // | "..." Password: "valid" | "invalid" // | "..." Message: "Welcome" | "Invalid credentials" // | "..." // ... } // I = Input, O = Output, H = Header declare var I :Context , O :Context interface Examples<H extends unknown[]> { // by @jcalz :) (...rows: H): Examples<H> } // 此语法为带类型安全和自动补全的函数链式调用 declare function Examples<H extends unknown[]>(...rows: H): Examples<H> Examples ( I.User , I.Password , O.Message ) ( "OK" , "valid" , "Welcome" ) ( "KO" , "invalid" , "Invalid credentials" ) declare var ExamplesTTL_ideal: any // 这是理想的标签模板字面量(TTL)语法示例,第一个参数为表头,其余为对应表头类型的行 ExamplesTTL_ideal ` ${[ I.User , I.Password , O.Message ]} ${[ "OK" , "valid" , "Welcome" ]} ${[ "KO" , "invalid" , "Invalid credentials" ]} `
类型声明方案
你可以通过泛型约束实现和链式调用版本一致的类型安全与自动补全,以下是两种可选的声明方式:
通用版本(适配任意表头类型)
type HeaderToRow<H extends unknown[]> = { [K in keyof H]: H[K] }; declare function ExamplesTTL_ideal<H extends unknown[]>( strings: TemplateStringsArray, ...exprs: [HeaderToRow<H>, ...HeaderToRow<H>[]] ): void;
针对Context的严格版本
如果需要限制表头只能是Context属性的类型值,可以用更精准的约束:
type ContextValue<K extends keyof Context> = Context[K]; type HeaderRow = readonly ContextValue<keyof Context>[]; type DataRow<H extends HeaderRow> = { [K in keyof H]: H[K] }; declare function ExamplesTTL_ideal<H extends HeaderRow>( strings: TemplateStringsArray, ...exprs: [H, ...DataRow<H>[]] ): void;
核心逻辑说明
- 泛型
H用于捕获表头的类型数组 TemplateStringsArray是标签模板字面量的固定第一个参数,对应模板中的纯字符串部分...exprs的类型约束[H, ...DataRow<H>[]]确保:- 第一个表达式必须是表头
- 后续所有行的类型严格匹配表头的类型结构
- 自动补全和类型校验会同步生效
内容的提问来源于stack exchange,提问作者qwertys
相关产品推荐
相关产品推荐

