Машинопись: возможно ли вывести возвращаемое значение из значения аргумента? - PullRequest
0 голосов
/ 08 октября 2018

Как бы вы реализовали myFunc?

const myObj: {prop: 'hello'} = myFunc('hello');

Я могу сделать это:

function myFunc<T = string>(value: T): {prop: T} {
    return {prop: value};
}

const obj: {prop: 'hello'} = myFunc<'hello'>('hello');

Есть ли способ заставить его работать без <'hello'>?

1 Ответ

0 голосов
/ 08 октября 2018

Typescript будет делать вывод, основываясь на типе возвращаемого значения, поэтому, например, здесь T будет выведено привет:

function myFunc<T>(): { prop: T } {
    return null as any;
}

const myObj: {prop: 'hello'} = myFunc(); // T is inferred to hello if we hover  in VS Code over the call we can see this.

Сформируйте свой вопрос, хотя я не думаю, что это то, что вы ищете,Если вы хотите, чтобы T выводился как строковый литерал, вам нужно указать T extends string, и тогда вам не нужно указывать дополнительную аннотацию типа:

function myFunc<T extends string>(value: T): { prop: T } {
    return null as any;
}

const myObj: {prop: 'hello'} = myFunc('hello'); // T is inffered to hello
const myObj2  = myFunc('hello'); // T is inffered to hello, myObjs2 is typed as  {prop: 'hello'} , no types necessary
...