Как вы официально создаете тип подмножества надмножества в Typescript? - PullRequest
1 голос
/ 03 мая 2020

У меня есть общая функция c, которая должна передавать содержимое данного типа тому, кто захочет его получить.

что-то вроде

function broadcast(J:Record<string,unknown>){...}

, но когда мне нужно применить конкретный тип c к этой функции, я получаю сообщение об ошибке, например

interface foo
{
   thing: string;
}

const a:foo={thing:'wow'};

broadcast(a); // error that I am not using a specific type but broadcast doesn't care.

Я выяснил Я могу развернуть этот тип так:

broadcast((a as unknown) as Record<string,unknown>) 

, но я думаю, что есть лучший способ.

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Ниже должно работать, вместо unknown, передать Record аргумент типа T. Также вам даже не нужно interface foo.

function broadcast<T>(J : Record<string,T>){
    console.log(J)
}

const a = {thing:'wow'};

broadcast<string>(a); 
0 голосов
/ 03 мая 2020

В вашем примере вам на самом деле не нужен интерфейс foo, поскольку он не генерирует никаких значений, помогающих вам сохранить тип кода в безопасности.

Основная проблема с вашим кодом - использование типа unknown, все может назначаться неизвестному, но неизвестное не может назначаться никому, кроме себя.

Именно поэтому переменная a с типом интерфейса *1008* не может быть назначена параметру, ожидающему Record<string, unknown> .

Замена его на Record<string, any> сделает набор текста снова счастливым.

Однако, как я говорил ранее, эта дополнительная защита интерфейса foo не генерирует никакого значения, так что вы можете просто рассмотреть ее удаление.

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