繁体   English   中英

Typescript 泛型参数断言

[英]Typescript generic parameters assertion

我想对以下代码进行编译时断言:

interface FormFields {
  [K: string]: string | boolean | number;
}

function FormTextInput<
  FieldName extends keyof Fields,
  Fields extends FormFields
>(fieldName: FieldName) { ... }

// should throw compile-time error:
FormTextInput<'someNumberField', { someNumberField: number }>('someNumberField')

// should NOT throw error:
FormTextInput<'someStringField', { someStringField: string }>('someStringField')

因此,如果FieldName引用Fields的非字符串值, FormTextInput总是会抛出错误

是否可以在编译时使用 Typescript 执行此操作? 我看过一些关于asserts的文档( https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#assertion-functions ),但它似乎不是要使用的对于这种情况

您可以定义帮助实用程序,该实用程序从源类型中选择具有字符串值的键:

type PickKeysWithStringValue<T> =
  { [P in keyof T]: T[P] extends string ? P : never }[keyof T];

type Test = PickKeysWithStringValue<{ foo: string, bar: number }> // results in "foo"

function FormTextInput<Fields extends FormFields>(fieldName: PickKeysWithStringValue<Fields>) {  }

// throws compile-time error:
FormTextInput<{ someNumberField: number }>('someNumberField')

// doesn't throw error:
FormTextInput<{ someStringField: string }>('someStringField')

操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM