Typescript generi c утверждение параметров - PullRequest
0 голосов
/ 23 апреля 2020

Я хочу сделать утверждение времени компиляции для следующего кода:

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')

, чтобы FormTextInput всегда выдавало ошибку, если FieldName относится к строковое значение Fields

Возможно ли это сделать во время компиляции с Typescript? Я видел некоторые документы по asserts (https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#assertion -функциям ), но не похоже, что он предназначен для этого сценария

1 Ответ

1 голос
/ 23 апреля 2020

Вы можете определить вспомогательную утилиту, которая выбирает ключи со строковым значением из типа источника:

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')

Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...