Typescript Расширенный тип NonFunctionPropertyNames Объяснено

После некоторого обширного тестирования я сделал следующие выводы:

  • Только IE откроет файл: // ссылки, которые находятся на странице с удаленного хоста, другие браузеры будут блокировать их прямо и ничего не произойдет, когда пользователь на них нажмет.
  • IE откроет только файл: // URL-адреса, указывающие на файл, который находится на сетевом диске. Если пользователь нажимает на файл: // ссылка, указывающая на файл на локальном диске пользователя, ничего не произойдет, и они не получат ошибок.
  • Если пользователь нажимает ссылку на файл: //, указывающую на сетевой файл, он будет открываться в браузере, если это возможно.
  • Если файл: // url указывает на недопустимое местоположение (не подключенный сетевой диск, файл на сетевом диске, которого не существует), Windows покажет всплывающее сообщение.
  • Пространства в пути к файлу должны быть закодированы в URL с помощью% 20

Надеюсь, это поможет кому-то еще узнать, кто ищет информацию о файлах.

2
задан Hivaga 18 January 2019 в 10:16
поделиться

1 ответ

То, что вы видите, это запрос типа. Если вы индексируете тип объекта, вы получите тип этого свойства. Например:

type Foo = { foo: number }['foo'] // is number

Если вы индексируете, используя объединение нескольких свойств, вы получаете объединение всех типов свойств:

type FooBar = { foo: number, bar: string, baz: boolean }['foo' | 'bar']  // string | number

Если вы индексируете, используя все ключи, вы получаете объединение всех типов свойств:

type FooBarBaz = { foo: number, bar: string, baz: boolean }['foo' | 'bar' | 'baz']  // string | number | boolean

Но чтобы получить объединение всех имен свойств, вы можете использовать keyof, поэтому приведенный выше тип также можно записать как:

type O =  { foo: number, bar: string, baz: boolean }
type FooBarBaz = O[keyof O]  // string | number | boolean

Тип { [K in keyof T]: K } соответствует типу объекта, где ключи типизируются как один и тот же литеральный тип, представляющий ключ:

type O =  { foo: number, bar: string, baz: boolean }
type FooBarBaz = { [K in keyof O]: K } // { foo: "foo"; bar: "bar"; baz: "baz"; }

Условный тип делает некоторые из этих ключей не одинаковыми. как литеральный тип, представляющий ключ, но вместо этого печатает их как never:

type O =  { foo: number, bar: string, baz: () => boolean } // baz is a function now
type NonFunctionPropertyNames = { [K in keyof O]: O[K] extends Function ? never: K } //  { foo: "foo"; bar: "bar"; baz: never; }

Таким образом, новый тип по-прежнему имеет все ключи оригинала, но некоторые типизированы как литеральный тип соответствующего ключ, а некоторые набраны как never. Нам нужно объединение со всеми типами значений ключей только что созданного нами типа, и мы можем использовать keyof O, как и раньше (поскольку тип имеет те же ключи, что и O):

type O =  { foo: number, bar: string, baz: () => boolean } // baz is a function now
type NonFunctionPropertyNames = { [K in keyof O]: O[K] extends Function ? never: K }[keyof O] // "foo" | "bar" | never = "foo" | "bar" ;

never всегда удаляется из объединений, поэтому в конце мы получаем объединение только тех объектных ключей, которые никогда не были.

Сделайте O параметром типа, и у вас будет многоразовый тип для получения нефункциональных клавиш:

type NonFunctionPropertyNames<O> = { [K in keyof O]: O[K] extends Function ? never : K }[keyof O]
type Foo =  { foo: number, bar: string, baz: () => boolean } // baz is a function now
type NonFUnctionKeysOfFoo = NonFunctionPropertyNames<Foo> // "foo" | "bar"
0
ответ дан Titian Cernicova-Dragomir 18 January 2019 в 10:16
поделиться
Другие вопросы по тегам:

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