Аргумент типа 'X' не может быть назначен параметру типа 'X'
Добрый день. Я новичок в Type Script, используя VSCode.
Получение следующих ошибок:
ошибка TS2322: тип '() => строка' не может быть назначен типу 'строка'.
ошибка TS2322: тип "() => номер" не может быть назначен типу "номер".
Код:
DTO.ts
interface DTO {
getId(): number;
getValue(): string;
}
export = DTO;
LinkedObject.ts
class LinkedObject {
public value: string = "Not Set";
public id: number = 0;
constructor(value?: string, id?: number) {
this.value = value;
this.id = id;
}
}
export = LinkedObject;
Я пытаюсь создать экземпляр LinkedObject
класс, использующий вышеупомянутые методы интерфейса:
TravelClientFormPopulator.ts
class TravelClientFormPopulator {
public populateComboBoxUsingDTOs(dataObjects: Array<DTO>, comboBoxID: string): void {
// Get the combo box
var selectElement = <HTMLSelectElement> document.getElementById(comboBoxID);
// Reset the options
selectElement.options.length = 0;
var linkedObjectsToAdd: LinkedObject[] = new Array<LinkedObject>();
var defaultLinkedObject: LinkedObject = new LinkedObject("Not Selected", 0);
linkedObjectsToAdd.push(defaultLinkedObject);
for (var i = 0; i < dataObjects.length; i++) {
var value: string = dataObjects[i].getValue; // Error here
var id: number = dataObjects[i].getId; // And here
var linkedObject: LinkedObject = new LinkedObject(value, id);
}
}
}
Любая помощь будет высоко оценена.
10 ответов
Вы пропустите скобки:
var value: string = dataObjects[i].getValue();
var id: number = dataObjects[i].getId();
Для чего это стоит, если у кого-то есть эта проблема только в VSCode, просто перезапустите VSCode, и он должен это исправить. Иногда Intellisense, кажется, портит импорт или типы.
Относится к Typescript: Аргумент типа 'RegExpMatchArray' не может быть назначен параметру типа 'string'
Также добавив другие сценарии, где вы можете увидеть эти ошибки
Сначала проверьте версию компилятора. Загрузите последнюю версию компилятора Typescript для поддержки синтаксиса ES6.
машинописный текст по-прежнему выдает выходные данные даже с ошибками ввода, которые фактически не блокируют разработку
Когда вы видите эти ошибки Проверьте синтаксис при инициализации или при вызове этих методов или переменных,
Проверьте, не являются ли параметры функций неверным типом данных. Вы инициализированы как "строка" и присваиваете "логическое значение" или "число".
Например
1.
private errors: string;
//somewhere in code you assign a boolean value to (string)'errors'
this.errors=true
or
this.error=5
2.
private values: Array<number>;
this.values.push(value); //Argument of type 'X' is not assignable to parameter of type 'X'
Сообщение об ошибке здесь, потому что квадратные скобки для инициализации массива отсутствуют, он работает даже без него, но VS Code красный предупреждает.
private values: Array<number> = [];
this.values.push(value);
Замечания:
Помните, что Javascript typecasts в соответствии с назначенным значением, поэтому typcript уведомляет их, но код выполняется даже с этими ошибками, выделенными в VS Code
Пример:
var a=2;
typeof(a) // "number"
var a='Ignatius';
typeof(a) // "string"
Я делаю угловой 2 и машинописный текст, и я не понимал, что у меня есть пробел в моей записи стрелки
я имел .map(key = >
вместо .map(key =>
Обязательно следите за глупыми синтаксическими ошибками
В моем случае это был пользовательский интерфейс Item, но я случайно импортировал его из-за автозаполнения - углового класса Item. Убедитесь, что вы импортируете из нужной упаковки.
Вы просто используете тип переменной any и устраняете эти типы проблем.
код ошибки:
let accessToken = res;
localStorage.setItem(LocalStorageConstants.TOKEN_KEY, accessToken);
данная ошибка Аргумент типа '{}' не может быть назначен параметру типа 'строка'.
Код успеха:
var accessToken:any = res;
localStorage.setItem(LocalStorageConstants.TOKEN_KEY, accessToken);
мы создаем переменную типа var, затем используем тип переменной any и решаем эту проблему.
any = обрабатывать любой тип значения, чтобы удалить ошибку.
Для сценариев, в которых этой ошибки нельзя было избежать, мы можем @ts-игнорировать ошибку.
В моем случае мне пришлось передать строковый параметр isNaN, определение ts которого разрешает только параметр числового типа.
// @ts-ignore: Argument of type 'string' is not assignable to parameter of type 'number'.
if (isNaN(myParam)) { // myParam is of string type
throw new Error('myPram should be a number');
}
// but isNaN can accept string params too in javascript
isNaN(123) //false
isNaN('123') //false
isNaN(NaN) //true
isNaN('NaN') //true
Я получал это по этому делу
...
.then((error: any, response: any) => {
console.info('document error: ', error);
console.info('documenr response: ', response);
return new MyModel();
})
...
в этом случае, если сделать параметры необязательными, ts перестанет жаловаться
.then((error?: any, response?: any) => {
В моем случае, как ни странно, я пропустил импорт класса, на который он жаловался, и моя IDE не обнаружила его.
Эта проблема в основном возникает, когда ваш компилятор не может понять разницу между оператором приведения типа string к Number.
Вы можете использовать объект Number и передать свое значение, чтобы получить соответствующие результаты для него, используя Number (<<<<... Variable_Name...... >>>>)