Typescript: проверить тип после использования утверждения типа - PullRequest
0 голосов
/ 30 апреля 2018

Можно ли разрешить строгую проверку типа для значения после использования утверждения типа?

Например, иногда мне нужно создать тип функции с атрибутами:

type FuncPlus = {
    (): void;
    anAttr: number;
    anotherAttr: Array<number>;
};

const f = (() => { }) as FuncPlus;
f.anAttr = 1;

f.anotherAttr.length # will error because `anotherAttr` is `undefined`

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

Это самое близкое, что я нашел, но оно не очень "typcript-y":

const f: FuncPlus = Object.assign(
    () => { },
    {
        anAttr: 1,
        // without `anotherAttr` defined here, 
        // typescript will throw a compilation error, as desired
    }
)

Кто-нибудь знает другой путь?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Object.assign - это способ назначения типа FuncPlus, он уже достаточно краткий.

При небольшом наборе свойств можно использовать вспомогательную функцию, чтобы пропустить имена свойств:

const getFuncPlus = (fn: () => void, anAttr: number, anotherAttr: number[]): FuncPlus =>
 Object.assign(fn, { anAttr, anotherAttr });

getFuncPlus(() => {}, 1) // causes an error
0 голосов
/ 01 мая 2018

Будет

type FuncPlus = {
  (): void;
  anAttr: undefined | number;
  anotherAttr: undefined | Array<number>;
};

удовлетворить ваши условия?

const f = (() => {}) as FuncPlus;

f.anAttr = 1;
f.anAttr.toFixed() // good because of the above assignment

f.anotherAttr = "a" // errors - "a" is not assignable to type
f.anotherAttr.length // still errors // f.anotherAttr may be undefined

f.anotherAttr = []
f.anotherAttr.length // good
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...