never[]
. Но в простом случае TypeScript умеет выводить тип изначально пустого массива по последующим операциям над ним. Типа push.string[]
, как только будет "зафиксирован". Например, возвращён из функции или назначен в другую переменную.function buildArray() {
const test1 = []; // тут будет any[]
test1.push('str');
test1.push(1);
}
const array = buildArray(); // тип (string | number)[]
const test1 = []; // тут будет any[]
test1.push('');
const test2 = test1;
test2.push(2); // Argument of type '2' is not assignable to parameter of type 'string'.
// Заготовка для Some
interface SomeDraft {
value?: string | string[]; // Массив или значение. Может отсутствовать.
}
// Some имеет более строгий тип и как можно меньшую вариативность,
// чтобы в коде не делать проверки.
interface Some {
value: string[]; // Всегда присутствует. Всегда массив.
}
function makeSome({ value = [] }: SomeDraft): Some {
// Приводим к нормальному (более строгому) типу
return {
value: Array.isArray(value) ? value : [value],
};
}
// Здесь Some задаётся через заготовку - так проще задавать значения
// Но результат всегда более строгий - так проще значениями пользоваться
const foo = makeSome({ value: 'foo' }); // { value: ['foo'] }
foo.value.map(() => {}); // foo.value - всегда массив и TypeScript это знает
export function clearURL (url: URL): URL;
export function clearURL (url: string): string;
export function clearURL (url: URL | string, returnAsURL: true): URL;
export function clearURL (url: URL | string, returnAsURL: false): string;
export function clearURL (url: URL | string, returnAsURL: boolean): URL | string;
interface Options {
cats: number;
dogs: number;
}
const defaultOptions: Options = { cats: 100, dogs: 100 };
class Jodit<O extends Options> {
constructor(public options: O) {}
}
const jodit = new Jodit({ ...defaultOptions, mice: 1000 });
jodit.options.mice = 1024;
class Options {
cats = 100;
dogs = 100;
}
class Jodit<O extends Options> {
constructor(public options: O) {}
}
class MiceOptions extends Options {
mice = 1000;
}
const jodit = new Jodit(new MiceOptions());
jodit.options.mice = 1024;
@Component({
template: `<ng-container *ngComponentOutlet="myComponent"></ng-container>`
})
export class MyContainerComponent {
@Input()
myTemplate: string;
get myComponent(): Type<any> {
const template = this.myTemplate;
@Component({template})
class MyComponent {
};
return MyComponent;
}
}
search.value. Нет переменной search в области видимости
declare global {
interface String {
foo(): number;
}
}
String.prototype.foo = function () {
return 0;
};
@types
.npm install @types/node --save-dev
. И в tsconfig.json:{
"compilerOptions": {
"types": ["node"]
}
}
$.ajax({
url: this.url + this.currentPage,
type: `GET`,
/*... more params */
}).done(this.onRequest);
$.ajax({
url: this.url + this.currentPage,
type: `GET`,
/*... more params */
}).done(data => this.onRequest(data))
SystemJS.config({
"defaultJSExtensions": true,
map: {
css: '/js/system-css.js',
datepicker: 'js/datepicker.js'
},
meta: {
'*.css': { loader: 'css' }
},
baseURL: '/',
paths: {
jquery: 'js/jquery',
scrollbar: 'js/scrollbar'
}
});
interface ParentStateItem {
id: number;
title: text;
}
interface ParentState {
items: ParentStateItem[];
}
class Parent extends React.Component<{}, ParentState> {
}