[英]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.