Динамический тип с использованием строковой переменной в качестве имени свойства

Ответ Криса Джонсена велик, но с более новыми версиями Git (1.8.2 или новее) есть двойной шаблон звездочки, который вы можете использовать для более короткого решения:

# assuming the root folder you want to ignore is 'application'
application/**/*

# the subfolder(s) you want to track:
!application/language/gr/

Таким образом, вам не нужно «unignore» родительский каталог вложенной папки, которую вы хотите отслеживать.


С Git 2.17.0 (Не знаете, как раньше, чем эта версия. Возможно, вернуться к 1.8 .2), используя шаблон ** в сочетании с исключениями для каждого подкаталога, ведущего к вашим файлам. Например:

# assuming the root folder you want to ignore is 'application'
application/**

# Explicitly track certain content nested in the 'application' folder:
!application/language/
!application/language/gr/
!application/language/gr/** # Example adding all files & folder in the 'gr' folder
!application/language/gr/SomeFile.txt # Example adding specific file in the 'gr' folder
0
задан Cory Dolphin 13 July 2018 в 17:57
поделиться

1 ответ

Я думаю, что самое близкое, что вы собираетесь получить, это что-то вроде этого:

export function mapProp<PropertyName extends string, AssignedType>(
  value: AssignedType, 
  propertyName: PropertyName
) {

  type ReturnType = {
    [K in PropertyName]: AssignedType
  }; 
  // equivalent to Record<PropertyName, AssignedType>

  return {
    [propertyName]: value
  } as ReturnType;

}

В этом случае вы будете использовать тип сопоставленного типа вместо типа с сигнатурой индекса . Добавление параметра универсального типа PropertyName позволяет сузить ключевое прошлое string, если вы передадите ему строковый литерал:

const thing = mapProp(123, "abc");
thing.abc; // number
thing.def; // error

В этом случае ReturnType, как известно, эквивалентен к {abc: number}. Если все, что вы знаете, это ключ string во время компиляции, вы получите следующее:

declare const propName: string;
const stuff = mapProp(123, propName);
stuff.abc; // number
stuff.def; // number 

Теперь ReturnType эквивалентно {[k: string]: number}, что означает, что он принимает любой string (и дает ему значение number). Это может быть не то, что вы хотите, но это лучший способ, который может сделать компилятор в этом случае.

Также обратите внимание, что без использования утверждения типа (as ReturnType) вычисляемые свойства обычно заканчиваются как строковые индексы что-то более конкретное. В настоящее время это ограничение дизайна для TypeScript. Было несколько попыток справиться с этим, но пока ничего не сделано на этом языке.

Надеюсь, что это помогает; удачи!

0
ответ дан jcalz 17 August 2018 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: