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

#typescript

#typescript

Вопрос:

Я пишу функцию util, которая возвращает объект с именем свойства, которое я предоставил.

 function example(fieldName: string) {
    return {
        [fieldName]: 'Value',
    };
}
  

Мне нужно объявить тип возвращаемого значения для этого, но, как вы догадываетесь, его возврат зависит от заданного параметра fieldName.

Это должно быть что-то вроде этого. Когда я отправляю пример в качестве параметра, возвращаемый тип должен быть таким

 {
    example: string;
}
  

Ответ №1:

Вам нужен параметр типа, чтобы фиксировать буквальный тип передаваемой строки. С помощью этого вы можете использовать Record для создания типа с этим ключом и определенным типом значения:

 function example<K extends string>(fieldName: K): Record<K, string> {
    return {
        [fieldName]: 'Value',
    };
}

let e = example("foo");
e.foo //ok
e.notFoo //err
  

Это сработает, если переданный аргумент является строковым литералом или чем-то еще, имеющим тип строкового литерала. Если тип аргумента string , вы не получите никакой проверки типа:

 let k = "foo" as string;
let e = example(k); // Record<string, string>
e.foo //ok
e.notFoo //still ok